2015-10-04 46 views
1

我正在製作使用報警服務的應用程序。我仍然在學習它是如何工作的,但有一件事情很不明確,並且沒有任何解釋。關於AlarmManager及其保存方式

假設您在啓動應用程序時創建了鬧鐘。警報被保存在某個地方,因爲即使您的應用程序沒有運行,它也需要觸發,對吧?

如果是這樣,當重新啓動我的應用程序時,如何獲得此警報,因此我不會每次都創建一個新警報,並將警報的無限存儲位置?

如果不是,它是如何工作的?我正在考慮使用數據庫或json文件,但我有一種感覺,這是沒有必要的。

在我的MainActivity類別,我有這樣的代碼來檢查,如果報警已經存在(此代碼顯然是錯誤的)...

AlarmReceiver alarm; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    Button b = (Button) findViewById(R.id.button); 
    b.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      if(alarm != null){ 
       alarm.cancel(); 
      } 
      alarm = new AlarmReceiver(MainActivity.this); 
     } 
    }); 



} 

我已經設置在設備重新啓動的廣播接收器(如在android教程解釋)

public class SampleBootReceiver extends BroadcastReceiver { 

@Override 
public void onReceive(Context context, Intent intent) { 
    if (intent.getAction().equals("android.intent.action.BOOT_COMPLETED")) { 
     new AlarmReceiver(context); 
    } 
} 
} 

這是AlarmReceiver類本身:

public class AlarmReceiver { 
private AlarmManager alarmMgr; 
private PendingIntent alarmIntent; 

public AlarmReceiver(Context context){ 
    alarmMgr = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 
    Intent intent = new Intent(context, AlarmBroadcastReceiver.class); 
    alarmIntent = PendingIntent.getBroadcast(context, 0, intent, 0); 

    Calendar calendar = Calendar.getInstance(); 
    calendar.setTimeInMillis(System.currentTimeMillis()); 
    calendar.set(Calendar.HOUR_OF_DAY, 17); 
    calendar.set(Calendar.MINUTE, 30); 

    alarmMgr.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), 
      1000 * 60 * 20, alarmIntent); 
    ComponentName receiver = new ComponentName(context, SampleBootReceiver.class); 
    PackageManager pm = context.getPackageManager(); 

    pm.setComponentEnabledSetting(receiver, 
      PackageManager.COMPONENT_ENABLED_STATE_ENABLED, 
      PackageManager.DONT_KILL_APP); 

} 

public void cancel(){ 
    alarmMgr.cancel(alarmIntent); 
} 
} 

這只是啓動的通知(工作)的AlarmBroadcastReceiver:

public class AlarmBroadcastReceiver extends BroadcastReceiver { 

@Override 
public void onReceive(Context context, Intent intent) { 
    new NotificationMessage(context); 
} 
} 

回答

3

報警被保存的地方,因爲它需要甚至觸發時,你的應用程序沒有運行,對不對?

正確。

如何重新發動我的應用程序

你別當我得到這個報警。這是一個只寫API。

所以我不會每次都創建一個新的鬧鐘,並且無限的鬧鐘存儲在某處?

只在需要時創建警報,而不是在您的應用程序的每次運行中創建警報。

除此之外,當調用AlarmManager方法替換該報警(或使用cancel()取消報警)時,使用等效的PendingIntent作爲現有報警。

我正在考慮使用數據庫或json文件,但我有一種感覺,這是沒有必要的。

在持續存儲中需要足夠的信息才能知道警報何時結束該做什麼。您還需要持久存儲中的足夠信息來了解需要什麼警報,以便在重新安排先前計劃的警報時處理重新啓動。

+0

「除此之外,在調用AlarmManager方法來替換該鬧鐘(或使用cancel()取消鬧鐘)時,使用與當前鬧鐘等效的PendingIntent。「是否有可能只在我的AlarmReceiver類中做到這一點?如果我不能訪問我以前設置的鬧鐘,那我該如何改變它? – zuokuok

+0

@zuokuok:」是否有可能只在我的AlarmReceiver類中做到這一點?「 - - 據推測,一個等效的PendingIntent是相同的操作(activity,service,broadcast),相同的ID(getActivity()的第二個參數等)和一個等價的Intent。在路由特徵(組件,動作,類別,數據,MIME類型)上,但不必與額外匹配。「那麼我該如何改變它?」 - 創建一個等同的PendingIntent並使用它來安排一個新的警報,這將取代舊的警報 – CommonsWare

+0

這是正確的,我的課寫的方式將覆蓋當前的警報設置,因爲我的pendingIntent始終保持一致? – zuokuok