23

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

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

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

それを行う方法に関するヒントはありますか?ありがとう!

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

4

2 に答える 2

44

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();
}

レシーバーは、アクティビティがフォアグラウンドにある場合にのみアラームの意図を受け取ります:)

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

于 2010-02-17T17:13:27.237 に答える
38

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

これは、github の自分のタイマー プロジェクトで行いました。アラーム レシーバーリクエリ レシーバーは次のとおりです。それが役立つことを願っています。

于 2010-03-19T20:36:56.363 に答える