0

"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); 

答えて

1

私が最初にマニフェストに静的に私の放送受信機を登録してみてください。それは動作しません。

LocalBroadcastManagerのマニフェスト登録受信者は使用できません。 LocalBroadcastManager.getInstance().registerReceiver()で登録された受信者だけがローカルブロードキャストに応答します。

私のアプリは、成功メッセージを受信した後にサーバリクエストを送信するか、失敗メッセージを受信した後に通知をポップアップするように、ブロードキャストに反応する必要があります。

サービスを中止してください。

+0

私のサービスは多くのアプリ向けに設計されているため、サービスに書き込むのは少しです。アプリは特定のメッセージで異なることをすることがあります。この問題を解決するためにグローバル放送を使用することは可能ですか? –

+0

@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

関連する問題