ブロードキャストを処理する可能性のあるオブジェクトが2つしかない場合(この場合はアクティビティと通知コントローラー)、LocalBroadcastManagerのみを使用して順序付けられたブロードキャストの動作を実現できます。
一般的な考え方は次のとおりです。
- 結果を表示したいときに特定のアクションでアクティビティにインテントをブロードキャストするようにサービスを設定します
- アクティビティで、サービス結果インテントを処理するBroadcastReceiverを作成し、ステップ1のアクションを使用して、IntentFilterを使用してLocalBroadcastManagerに登録します。
- サービスで、結果が利用可能な場合、LocalBroadcastManager.getInstance(Context).sendBroadcast(Intent)を使用して結果Intentを送信してみてください。このメソッドは、ブロードキャストが少なくとも1つの受信者に送信されたかどうかを示すブール値を返します。このブール値がfalseの場合は、アクティビティがブロードキャストを処理しなかったことを意味し、代わりに通知を表示する必要があります。
あなたのサービスで:
public UnzipService extends IntentService {
public static final String ACTION_SHOWRESULT = UnzipService.class.getCanonicalName() + ".ACTION_SHOWRESULT";
@Override
protected void onHandleIntent(Intent intent) {
Thread.sleep(500); // Do the hard work
// Then try to notify the Activity about the results
Intent activityIntent = new Intent(this, YourActivity.class);
activityIntent.setAction(ACTION_SHOWRESULT);
activityIntent.putExtra(SOME_KEY, SOME_RESULTVALUE); // Put the result into extras
boolean broadcastEnqueued = LocalBroadcastManager.getInstance(this).sendBroadcast(activityIntent);
if (!broadcastEnqueued) { // Fallback to notification!
PendingIntent pendingIntent = PendingIntent.getActivity(this, (int) System.currentTimeMillis(), activityIntent, PendingIntent.FLAG_UPDATE_CURRENT);
((NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE))
.notify(SOME_ID, new NotificationCompat.Builder(this)
.setContentIntent(pendingIntent)
.setTicker("results available")
.setContentText("results")
.build());
}
}
}
あなたの活動で:
public YourActivity extends Activity {
private BroadcastReceiver resultReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
processResult(intent); // Results Intent received through local broadcast
}
}
private IntentFilter resultFilter = new IntentFilter(UnzipService.ACTION_SHOWRESULT);
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate();
Intent intent = getIntent();
if (UnzipService.ACTION_SHOWRESULT.equals(intent.getAction())) {
// The Activity has been launched with a tap on the notification
processResult(intent); // Results Intent contained in the notification PendingIntent
}
}
@Override
protected void onResume() {
super.onResume();
LocalBroadcastManager.getInstance(this)
.registerReceiver(resultReceiver, resultFilter);
}
@Override
protected void onPause() {
LocalBroadcastManager.getInstance(this)
.unregisterReceiver(resultReceiver);
super.onPause();
}
private void processResult(Intent intent) {
// Show the results from Intent extras
}
}
これは完全な実例であるはずです。
これが、サポートライブラリのLocalBroadcastManagerを使用して順序付けられたブロードキャストを実装しようとしている人に役立つことを願っています。