0

Android では、AlarmManager を使用して、1 日に 1 回実行される繰り返しタスクを設定します。ユーザーは、このアラームの時間を選択できます。たとえば、彼が 9:00 を選択すると、特定のタスクが毎日 9 時に実行されます。つまり、保留中のインテントが開始され、通知バーに通知が表示されます。

私のアプリのユーザーは、その時点でデバイスの電源を切ったときに通知がまったくないと言います。アラームが鳴ったタイミングで電源が切れていた場合、再起動してもアラームは繰り返されないというのは本当ですか?

これが正常な動作である場合、どのように回避できますか? 通知をトリガーする IntentService に共有設定 (「last_execution_time」など) を書き込む必要がありますか? 起動時に、最後の実行が 24 時間以上前かどうかを確認できます。そうであれば、それを繰り返しますか?

4

1 に答える 1

0

action を使用してインテントのブロードキャスト レシーバーを登録しandroid.intent.action.BOOT_COMPLETEDます。これにより、AlarmManager でスケジュールしたのと同じタスクが開始されます (以前は、AlarmManager によって期限内に起動されなかったことを確認していました)。

編集:追跡するために、そのように試してみてください(それは単なるヒントです-自分で9前後の正確な時間を安全に処理してください;)

public class KeepTrackReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        SharedPreferences p = context.getSharedPreferences(
                TrackedAlarmService.FILE_ALARM_TRACK, Context.MODE_PRIVATE);
        long lastAlarm = p.getLong(TrackedAlarmService.KEY_LAST_ALARM_MILLIS, -1L);
        if(lastAlarm == -1L || lastAlarm < TrackedAlarmService.getClosest9AM(false)) {
            context.startService(TrackedAlarmService.createIntent(context));
        }

    }
}
public class TrackedAlarmService extends IntentService {

    public static final String FILE_ALARM_TRACK = "alarmTrack";
    public static final String KEY_LAST_ALARM_MILLIS = "lastAlarmMillis";

    public static void schedule(Context context) {
        AlarmManager am = (AlarmManager) context.getSystemService(
                Context.ALARM_SERVICE);

        PendingIntent pi = PendingIntent.getService(context, 0, 
                createIntent(context), PendingIntent.FLAG_CANCEL_CURRENT);

        am.setRepeating(AlarmManager.RTC_WAKEUP, getClosest9AM(true), 
                AlarmManager.INTERVAL_DAY, pi);
    }

    public static long getClosest9AM(boolean futurePastFlag) {
        Calendar c = Calendar.getInstance();
        c.setTimeInMillis(System.currentTimeMillis());
        if(futurePastFlag) {
            if(c.get(Calendar.HOUR_OF_DAY) > 9) {
                c.roll(Calendar.DATE, true);
            }
        }
        else {
            if(c.get(Calendar.HOUR_OF_DAY) < 9) {
                c.roll(Calendar.DATE, false);
            }
        }
        c.set(Calendar.HOUR_OF_DAY, 9);
        c.set(Calendar.MINUTE, 0);
        return c.getTimeInMillis();
    }

    public static Intent createIntent(Context context) {
        return new Intent(context, TrackedAlarmService.class);
    }

    public TrackedAlarmService() {
        super("TrackedAlarmService");
    }

    @Override
    protected void onHandleIntent(Intent intent) {

        //save last alarm time  
        getSharedPreferences(FILE_ALARM_TRACK, MODE_PRIVATE)
            .edit()
            .putLong(KEY_LAST_ALARM_MILLIS, System.currentTimeMillis())
            .commit();

        // Do your repeating job....
    }
}
于 2012-07-06T21:54:22.847 に答える