特定の時間に(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 プロセスが停止しているようです。
理由はありますか?どうすれば回避できますか?