0

問題は、ユーザーがデバイスを起動するまで、通常「呼び出される」onReceiveメソッドが遅延することです。BroadcastReceiverAlarmManager

これは私には起こったことはありません。私が持っている情報は、ユーザーから送信されたレポートからのものです. ログを見ると、最初のケースでは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
            }
        });
    }
}
4

1 に答える 1

0

指定した間隔でタスクをスケジュールしたい場合は、フラグAlarmManager.RTCを使用せずAlarmManager.RTC_WAKEUP、メソッドを使用してくださいalarm.setRepeating(...)。この場合、アラームはデバイスのリアルタイム クロックにバインドされるためです。そのため、システム時刻を変更すると、アラームが誤動作する可能性があります。AlarmManager.ELAPSED_REALTIMEフラグまたはを使用する必要がありますAlarmManager.ELAPSED_REALTIME_WAKEUP。この場合SystemClock.elapsedRealtime()、アラームをスケジュールするための基礎として機能します。

コードは次のようになります。

alarmManager.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime() + checkIntervalMillis, checkIntervalMillis, pendingIntent);

デバイスがスリープ モードのときに長時間実行されるタスクを実行する場合は、CommonsWare の WakefulIntentService ライブラリを使用することをお勧めします: https://github.com/commonsguy/cwac-wakeful

于 2013-05-22T10:13:19.583 に答える