0

特定の期間の後に X タスクを実行AlarmManagerするようにスケジュールするために、私は で遊んでいます。IntentServiceこれまでのところ、うまく機能しています。

public static void scheduleNextRefresh (final Context context, long msFromNow) {

    Constants.logMessage("Scheduling fetcher alarm to happen within: " + msFromNow/(1000*60) + " minutes");

    Intent intent = new Intent(context, AlarmReceiver.class);       
    intent.putExtra(AlarmReceiver.EXTRA_ACTION, AlarmReceiver.FETCH_NEWS);
    PendingIntent pendingIntent = PendingIntent.getBroadcast(context, REQUEST_CODE, intent, PendingIntent.FLAG_UPDATE_CURRENT);

    AlarmManager alarm = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);

    if (msFromNow != -1) {
        Constants.logMessage("Alarm set");
        alarm.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime() + msFromNow, pendingIntent);
    }               
}

これまでのところ、うまく機能しています。ただし、通常は 30 分または数時間などの短い間隔しか使用しません。

数日後にアクションを実行するようにスケジュールを設定したいと考えています。それが で適切に機能するかどうか、または別のツールを使用して X 時間AlarmManagerに を送信する方が簡単かどうかに興味があります。PendingIntent

最小の間隔は 3 日であり、その過程で数回の再起動が発生する可能性があるため (私自身、少なくとも 1 日に 1 回は電話を再起動することを知っています)、それがどれほど実用的かはわかりませんAlarmManager

まず、私が使用している更新をスケジュールするロジックは上記と同じですが、唯一の違いは、必要に応じてアラームBroadcastReceiverをリッスンしandroid.permission.RECEIVE_BOOT_COMPLETEDて再スケジュールするためにコードを追加したことです。

@Override
public void onReceive(Context context, Intent intent) {
    final String action = intent.getAction();
    ...some other code
    else if (action.equals(Intent.ACTION_BOOT_COMPLETED)) {
        Constants.logMessage("Re-scheduling alarms after boot completed");
        SharedPreferences mPreferences = PreferenceManager.getDefaultSharedPreferences(context);
        //get the current interval we are using for cleanups
        long alarmInterval = Long.valueOf(mPreferences.getString("pref_key_ccleaner_interval", "259200000"));
        //get the last time in miliseconds that we set an alarm
        //Whenever I schedule an alarm in the IntentService 
        //I store the time in ms to know when it was last scheduled
        long lastAlarm = mPreferences.getLong(CacheCleaner.KEY_LAST_ALARM, 0);
        if (lastAlarm == 0) {
            //If no previous alarm is set, schedule it normally
            CacheCleaner.scheduleNextCleanup(context, alarmInterval);
        }
        else {
            //If there was an alarm set previously
            //The difference between the alarmInterval and the amount of ms ellapsed since last alarm
            //is the new time we will schedule this for
            CacheCleaner.scheduleNextCleanup(context, (alarmInterval - (System.currentTimeMillis() - lastAlarm)));
        }                       
    }

それはうまくいくと思いますが、再スケジュールや他のイベントを心配することなく、今から数日後にイベントをスケジュールするより良い方法があることに興味があります.

何か案は?

4

2 に答える 2

0

再起動後、アラームは保持されません。アラームのスケジュールを変更するには、起動時に実行する必要があります。これは、たとえば、組み込みの時計アプリケーションが行うことです。

Android 5.0 以降では、代わりに JobScheduler メカニズムの使用に切り替えることができます。それらを使用すると、独自の起動時の実行やウェイクロックなどを処理する必要はありません。実行するタイミングを指定するだけで (さらに、デバイスの充電中のみ実行するなどのその他の興味深い制約も指定できます)、OS が適切なタイミングで実行してくれます。

于 2014-11-19T21:22:38.897 に答える