0

私の質問は、「いつ手紙を読むことができるようになるか」ではなく、「私のポストが郵便配達員にいつ気付かれるか」についてです。

Activityユーザーがリストを編集できるようにします。ユーザーが編集をコミットするとすぐにIntentServiceが開始され、データベース ヘルパーが呼び出され、必要に応じてデータベース エントリが変更されます。

データベースが正常に更新されるとすぐに (それまでは何もクラッシュしませんでした)、データベース ヘルパーは "ok" を に書き込みSharedPreferencesIntentService. はIntentServiceにメッセージを送信します。BroadcastReceiverこれにより、現在のデータでリストが db から再ロードされます。

はのBroadcastReceiver内部クラスであり、Activityに動的に登録されますonCreate()

    mReceiver = new MyMessageReceiver();
    IntentFilter iFilter = new IntentFilter();
    iFilter.addAction("com.example.mycoolapp.LOCALINTENT");
    LocalBroadcastManager.getInstance(this).registerReceiver(mReceiver, iFilter);

リストがリロードされるまでユーザーが my にとどまっていたActivityとしても、まったく問題はありません。しかし、ユーザーが動き回り、どういうわけか方向の変化を引き起こしていると想像してください...それが私が「OK」を持っている理由ですSharedPeferences:

ではonCreate()、受信者を登録した後、保留中のアクションがあるかどうかを確認します。

データベースが正常に更新された場合は、データをロードして、受信者が次のメッセージを無視するようにフラグを設定するだけです。IntentService がsetIntentRedelivery(true).

データベースがまだ更新されていないことがわかった場合は、 からのブロードキャストを待つことにしIntentServiceます。

私が非常に不確かなことの1つは、次のことです。

システムが受信機を「稼働中」と見なすのはいつからですか? 私はそれが終わったonReceive()後にしか呼び出せないことを知っています。onCreate()

実行中onCreate()に IntentService がローカル ブロードキャストを起動し (「早すぎる」)、レシーバーがそれを取得できない可能性はありますか?

その後、そのリストは、ユーザーがActivity(かなり可能性が高い) を離れ、もう一度戻るまで (そうではない可能性が高い) 更新されることはありません。

4

1 に答える 1

2

ブロードキャスト レシーバーはアクティビティではなく、メイン アプリケーション スレッドに登録されます。registerReceiver メソッドは Context クラスで定義されています。

つまり、Broadcast レシーバーは、registered登録を解除するか、アプリケーションが破棄されるまで (つまり、レシーバーが にないService)残ります。

ドキュメントを確認する

システムが受信機を「稼働中」と見なすのはいつからですか? onReceive() は、onCreate() が終了した後にのみ呼び出すことができることを知っています。

registerReceiver() が戻った瞬間から

onCreate() の実行中に IntentService がローカル ブロードキャストを起動し (「早すぎる」)、レシーバーがそれを取得できない可能性はありますか?

を継承するクラスの onCreate メソッドにレシーバーを登録することで、これを回避できますApplication。これにより、ブロードキャスト レシーバーが最初に行われることを確認できます。

于 2016-01-29T15:07:28.623 に答える