2

私のアプリは、1 時間ごとに特定のタスクを実行する必要があります。アプリが実行中、一時停止中、または閉じているかどうかは問題ではありません。

アプリが実行中または一時停止しているときは、AlarmManager ブロードキャストレシーバーをスケジュールするだけで実行できます。しかし、アプリケーションが閉じられると、インテントを漏らさないように「unregisterReceiver」を呼び出す必要があり、タスクを処理するためにアプリが起動 (または何か) されることはありません。

次に、問題は次のとおりです。登録を解除する必要のないアラームマネージャータスクをスケジュールして、アプリケーションが閉じられても呼び出されるようにする方法は?

4

2 に答える 2

3

これに使用AlarmManager.setRepeating(int type, long triggerAtTime, long interval, PendingIntent operation)します。タイプをAlarmManager.RTC_WAKEUPに設定して、デバイスがスリープ状態の場合に確実にウェイクアップするようにします (それが要件である場合)。

このようなもの:

    Intent intent = new Intent("com.foo.android.MY_TIMER");
    PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, intent, 0);
    AlarmManager manager = (AlarmManager) getSystemService(ALARM_SERVICE);
    long now = System.currentTimeMillis();
    long interval = 60 * 60 * 1000; // 1 hour
    manager.setRepeating(AlarmManager.RTC_WAKEUP, now + interval, interval,
        pendingIntent); // Schedule timer for one hour from now and every hour after that

このメソッドに PendingIntent を渡します。インテントの漏洩を心配する必要はありません。

AlarmManager.cancel()アラームが不要になったら、忘れずに電話してアラームをオフにしてください。

このためのコードでレシーバーを登録しないでください。<intent-filter>次のように、BroadcastReceiver のマニフェスト エントリにタグを追加するだけです。

    <receiver android:name=".MyReceiver">
        <intent-filter>
            <action
                    android:name="com.foo.android.MY_TIMER"/>
        </intent-filter>
    </receiver>
于 2012-05-30T15:15:16.597 に答える
0

このために呼び出される Android コンポーネントを使用する必要がありますService。サービス コードから、AlarmManager を PendingIntent クラスで使用して、時間ごとにタスクをスケジュールできます。AlarmManger は Service Components で宣言されているため、GUI を必要とせず、デバイスにバッテリーが搭載されるまでバックグラウンドで実行されます。

于 2012-05-30T15:07:18.677 に答える