0

AlarmManager が何度か議論されたことは知っていますが、私を助ける答えが本当に見つかりません。特定の時間にサービスを開始して何かを作成する必要があるアプリがあるため、いくつかの調査作業の後、AlarmManager が必要であると判断しました。

このコードを使用して仕事をします

    Intent myIntent=new Intent();
    ComponentName cn=new ComponentName("my.package.name", "my.package.name.AlarmService");
    myIntent.setComponent(cn);
    PendingIntent pendingIntent= PendingIntent.getService(alarm._context, alarm.id, myIntent, 0);
    AlarmManager alarmManager = (AlarmManager) _context.getSystemService(Context.ALARM_SERVICE);
    alarmManager.set(AlarmManager.RTC_WAKEUP, alarm.time, pendingIntent);

「アラーム」は私が書いたオブジェクトです。さて、このコードが機能するのは死のようだと確信しています.1つ(または複数)のアクションを2分または数時間先に設定すると機能するためです(サービスの最初の命令でファイルにログオンを書き込みます)。私が実行した場合

    adb shell dumpsys alarm

保留中のインテントをすべて確認できます。すべてが機能していることを確認できてうれしいです。次の場所でアクションをスケジュールします。

01:00 AM 08:00 AM 08:40 AM 09:15:AM 01:00 PM 02:00 PM 18:00 PM

このアクションを設定した後、実行します

   adb shell dumpsys alarm

保留中のインテントをすべて見ることができます。それから私は眠りにつくと.....午前 07:30 に目が覚めたとき、午前 01:00 にスケジュールされたアクションは実行されておらず、実行した場合

    adb shell dumpsys alarm

保留中のインテントがすべて消えました!!!!!!!!

このアプリケーションの作成に多くの時間を費やし、適切に動作させることができないため、この動作に本当に不満を感じています。あらゆることを試したので、数週間の調査の後にこの質問を投稿していますが、まだこの問題があります。私を助けてください

4

1 に答える 1

2

ドキュメントからAlarmManagerここにリンク):

アラーム マネージャは、アラーム レシーバの onReceive() メソッドが実行されている限り、CPU ウェイク ロックを保持します。これにより、ブロードキャストの処理が完了するまで電話がスリープ状態にならないことが保証されます。 onReceive() が戻ると、Alarm Manager はこの wake lock を解放します。 これは、onReceive() メソッドが完了するとすぐに電話がスリープする場合があることを意味します。アラーム レシーバーが Context.startService() を呼び出した場合、要求されたサービスが開始される前に電話機がスリープ状態になる可能性があります。これを防ぐには、BroadcastReceiver と Service で別の wake lock ポリシーを実装して、サービスが利用可能になるまで電話が動作し続けるようにする必要があります。

適切なウェイクロックの設定も保持していない場合Service、デバイスは終了時にすぐにスリープ状態に戻りAlarmManagerます。これもコードで管理する必要があります。

HTH

于 2012-06-12T17:42:43.207 に答える