1

特定の時間に(AlarmManagerを介して)トリガーされるBroadcastReceiverを取得しました。ユーザーが設定した設定に応じて、プログラムによってスケジュールされます。

BroadcastReceiver は次のことを行います (簡略化された疑似コード):

public void onReceive(Context context, Intent intent) {
  handler = new Handler();
  wifiManager.setWifiEnabled(true);
  // Wait a few seconds to activate wifi and get IP
  handler.postDelayed(new Runnable() {
    void run() {
      doTheJob();
    }
  }, 30000);
}

public void doTheJob() {
  doSomethingAndTheOther(); // this starts service: context.startService(i);
  wifiManager.setWifiEnabled(false);
}

このコードを HTC Desire で数年間問題なく使用しています。さらに、それが機能しないことに不満を持っているユーザーはいません。

しかし、最近 Galaxy S3 を購入しましたが、期待どおりに動作しません。数分後に (通知された設定を使用して) アラームを設定すると、期待どおりに動作します。

しかし、夜 (たとえば 3:00:00) にアラームを設定すると、アラームがトリガーされ、wifi がオンになり、他には何も起こりません。仕事は完了していませんし、明らかにwifiが最後にオフになっていません。ログを作成し、postDelayed() が呼び出されましたが、Runnable.run() が呼び出されません。

run() が呼び出される前に、BroadcastReceiver プロセスが停止しているようです。

理由はありますか?どうすれば回避できますか?

4

1 に答える 1

5

BroadcastReceivers は、使用後すぐに破棄されます。以前のバージョンの Android で変更されたかどうかはわかりませんが、ブロードキャスト レシーバーのインスタンスが存続するとは決して考えないでください。それらの目的は、イベントの即時処理であり、AlarmManager を使用して、またはサービスで発生するような遅延処理です。

于 2013-02-24T08:49:52.900 に答える