問題は、ユーザーがデバイスを起動するまで、通常「呼び出される」onReceive
メソッドが遅延することです。BroadcastReceiver
AlarmManager
これは私には起こったことはありません。私が持っている情報は、ユーザーから送信されたレポートからのものです. ログを見ると、最初のケースではonReceive
メソッド呼び出しがほぼ 2 時間遅れ、2 番目のケースでは約 20 分遅れていました。onReceive
どちらの状況でも、ユーザーが電話を起こした直後にアラーム (および) が開始されます。
問題は 2 日間連続して 2 回発生し、ユーザーは以前に発生したことはないと述べています。電話機の設定の唯一の特徴的な変更は、エア モードが有効になったことです。
私のコード:
アラームは次のように設定されます。
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, alarmIntent, PendingIntent.FLAG_UPDATE_CURRENT);
am.set(AlarmManager.RTC_WAKEUP, timeInMillis, pendingIntent);
Logger.log("posting alarm " + id + " for " + formatTime(timeInMillis);
ブロードキャスト レシーバの onReceiveMethod:
@Override
public void onReceive(Context context, Intent intent) {
Logger.initialize(context, "AlarmReceiver");
...
}
ユーザーから受け取ったログ:
481. 20/05 13:00:04 v89: posting alarm 4 for 7:0 (in 17:59)
486. 21/05 08:58:00 v89: logger initialized again from AlarmReceiver
536. 21/05 09:04:54 v89: posting alarm 4 for 7:0 (in 21:55)
541. 22/05 07:22:24 v89: logger initialized again from AlarmReceiver
エアモードで電話の覚醒をブロックすることはできますか? 防ぐことはできますか?それとも、まったく違うものなのでしょうか?どんな助けでも大歓迎です。
デバイスは、Android 4.1.2 を搭載した Samsung Galaxy SIII (GT-I9305) です。
編集:ロガーが原因で遅延が発生する可能性がある場合に備えて、そのコードを次に示します。mHandler
を使用して作成されているHandlerThread
ため、ブロックできないと思いますonReceive
よね?
public synchronized static void initialize(Context context, String src) {
if (mInstance == null) {//wasn't null
...
} else {
Logger.log("logger initialized again from " + src);
}
}
public synchronized static void log(final String text) {
Log.d(TAG, text);
if (mInstance != null && mInstance.mLoggingEnabled) {
mInstance.mHandler.post(new Runnable() {
@Override
public void run() {
//some database operations
}
});
}
}