"myAction"というアクションでインテントを使用して画像と放送のステータスをアップロードするフォアグラウンドサービスがあります。アプリの停止後にBroadcastReceiverが機能しない
私のアプリは、成功メッセージを受信した後にサーバリクエストを送信するか、失敗メッセージを受け取った後で通知をポップアップするように、ブロードキャストに反応する必要があります。私はこれに従いますhttps://developer.android.com/training/run-background-service/report-status.html
インテントを送信するインテントはアクティビティを開始または再開しません。 アクティビティのBroadcastReceiverは、アプリがバックグラウンドであってもインテント オブジェクトを受信して処理しますが、アプリをフォアグラウンドに強制的に移動させることはありません。アプリが表示されていない間にバックグラウンドで発生した イベントについてユーザーに通知する場合は、 通知を使用します。入ってくる ブロードキャストインテントに応答して、アクティビティを開始しないでください。
まず、ブロードキャスト受信機を静的にマニフェストに登録しようとします。それは動作しません。次に、私はブロードキャストレシーバを登録するサービスを開始するために、この指示、Keep broadcast receiver running after application is closedに従います。私はスワイプしたり、アプリケーションを閉じるときに両方(ログ表示されません)動作しません。具体的には、 "ハハハハ"と "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-i-implicit-broadcast-ban.html)。そして、あなたが解決する必要があるセキュリティ上の懸念があります。しかし、 'LocalBroadcastManager.getInstance(service).sendBroadcast(intent)'から 'service.sendBroadcast(intent);'に切り替えると、あなたのマニフェストに登録された受信機が動作します(Android Oが出荷されるまで)。 – CommonsWare