2012-07-06 110 views
0

在Android中,我使用AlarmManager設置每天執行一次的重複任務。用戶可以選擇該報警的時間。例如,當他選擇9點鐘時,每天9點鐘執行給定的任務,即開始向通知欄發出通知的未決意圖。Android設備啓動時重複通知

我的應用程序的用戶說,當他們的設備在那個時候關閉,根本沒有通知。這是真的,當設備在報警發生時關閉時,報警不會在重新啓動後重復?

如果這是正常行爲,那怎麼可能被規避?是否應該在觸發通知的IntentService中編寫共享首選項(例如「last_execution_time」)?在啓動時,我可以檢查最後一次執行是否超過24小時,如果是,重複執行?

回答

0

註冊廣播接收機意圖行動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.... 
    } 
} 
+0

謝謝。我的問題實際上是*如何*確保任務尚未被解僱。很明顯,我需要在這裏爲'BOOT_COMPLETED'提供廣播接收器。 – caw 2012-07-06 22:27:44

+0

只是跟蹤它,我認爲它更明顯;) – 2012-07-06 22:32:12