我有一個前景服務上傳圖像和廣播狀態使用intent與行動「myAction」。BroadcastReceiver在應用程序停止後不工作
我的應用程序需要對廣播做出反應,例如收到成功消息後發送服務器請求或收到失敗消息後彈出通知。我關注此https://developer.android.com/training/run-background-service/report-status.html
發送廣播意圖不啓動或恢復活動。 活動的BroadcastReceiver接收並處理目標,即使您的應用程序位於後臺但不強制 應用程序處於前臺。如果您想在應用程序不可見時通知用戶後臺發生的 事件,則 將使用通知。從不開始活動以響應傳入的廣播意圖 。
我首先嚐試在Manifest中靜態註冊我的廣播接收器。它不起作用。然後,我按照此指示Keep broadcast receiver running after application is closed開始註冊我的廣播接收器。當我滑出或關閉應用程序時,兩者都不起作用(沒有日誌顯示)。具體來說,我可以看到「HAHAHAHA」和「HEHEHEHE」日誌在前臺出現。一旦我從應用程序列表中刷出或點擊返回以退出應用程序,它就不會出現。
這是我的代碼。我在哪裏錯過?
在我的清單
<application...>
<receiver android:name=".MyBroadcastReceiver"
android:enabled="true"
android:exported="false">
<intent-filter android:priority="0">
<action android:name="myAction"/>
</intent-filter>
</receiver>
<service
android:name=".MyService"
android:exported="false"/>
</application>
MyBroadcastReceive.java
public class MyBroadcastReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
Log.d("HAHAHAHA", "Broadcast received.");
}
}
MyService.java
public class MyService extends Service {
BroadcastReceiver mReceiver;
// use this as an inner class like here or as a top-level class
public class MyReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// do something
Log.d("HEHEHEHE", "Broadcast received.");
}
}
@Override
public void onCreate() {
// get an instance of the receiver in your service
IntentFilter filter = new IntentFilter();
filter.addAction("myAction");
mReceiver = new MyReceiver();
registerReceiver(mReceiver, filter);
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onDestroy() {
Log.d("HEHEHEHE", "onDestroy");
super.onDestroy();
}
}
MainActivity.java
onStart() {
Intent intent = new Intent(this, MyService.class);
startService(intent);
}
廣播被稱爲象下面這樣:
LocalBroadcastManager.getInstance(service).sendBroadcast(intent);
把它寫在服務中有點小,因爲我的服務是爲許多應用程序設計的。應用程序可能會對某些消息做不同的事情是否有可能使用全球廣播來解決這個問題? –
@MingweiLin:如果你想在應用之間工作,全球廣播可以工作......至少在Android O今年晚些時候發貨之前。那時候,[事情會變得複雜](https://commonsware.com/blog/2017/04/11/android-o-implicit-broadcast-ban.html)。並且您需要解決安全問題。但是,如果您從'LocalBroadcastManager.getInstance(service).sendBroadcast(intent)'切換到'service.sendBroadcast(intent);',那麼您的清單註冊的接收器將工作(再次,直到Android O發貨)。 – CommonsWare