web-dev-qa-db-ja.com

フォアグラウンドにある場合にのみ、BroadcastReceiverからアクティビティを通知します

簡単かもしれませんが、今のところこれを正確に理解することはできませんでした... AlarmMangagerによってトリガーされるのを待っているBroadcastReceiverを取得しました-これは正常に機能します。

現在:イベントが発生した場合、メインアクティビティの画面上のいくつかの要素を更新する必要があるため、そのバックグラウンドのBroadcastReceiverからアクティビティにインテントを送信したいと思います-ただし、現在の場合のみフォアグラウンドでは、別名アクティブ。

それが実行されていないか表示されていない場合、私は気にしません-そして私がしたい最後のことは私の意図によってアクティビティを開始することです! onResume()メソッドでビューの再描画を処理するので、まったく気にしません。

それを行う方法についてのヒントはありますか?ありがとう!

EDIT:私のBroadcastReceiverは、ユーザーに通知する必要のあるアラームを待機しています。したがって、それはそこにあり、マニフェストで宣言されている必要があります。問題は、言及されたアクティビティが現在最前線にあるかどうかを判断する必要があるということです。

23
Zordid

したがって、これはほぼBinoの答えですが、レシーバーをアクティビティに移動する代わりに、インテントが異なる2つのレシーバーを使用します。最初のアラームインテントは元のアラームインテントで、受信者はマニフェストにすでに登録されています。次に、その受信者は2番目のブロードキャストインテントを送信します。これは、Binoが言うようにアクティビティによって登録された受信者によって処理されます。

これは、githubの自分のタイマープロジェクトで行いました。 アラームレシーバーリクエリレシーバー です。お役に立てば幸いです。

38
Chris Boyle

あなたはAlarmManagerに精通していると思います(新しいアラームの作成、レシーバーの登録...)ので、それについては説明しません。あなたの質問に対する解決策を教えてください。

BroadcastReceiverをクラスファイルとマニフェストに登録する代わりに、アクティビティに新しいBroadcastReceiverを作成し、それをonResumeメソッドに登録し、onPauseメソッドに登録解除します。これはアクティビティで次のようになります。

private BroadcastReceiver mIntentReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
      //do something       
    }
};

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    mIntentFilter = new IntentFilter();
    mIntentFilter.addAction("your alarm action");
    ...
}

@Override
protected void onResume() {
registerReceiver(mIntentReceiver, mIntentFilter);
    ...
super.onResume();
}

@Override
protected void onPause() {
unregisterReceiver(mIntentReceiver);
    ...
super.onPause();
}

受信者は、アクティビティがフォアグラウンドにある場合にのみアラームインテントを受信します:)

(私の英語がはっきりしない場合は申し訳ありません)

43
Binh Tran