2011-08-15 70 views
0

我有一個應用程序,我希望它每隔x天(由用戶預先定義)啓動通知。對於我正在使用此代碼: 類擴展廣播接收器:計劃通知未觸發

public class OnAlarmReceiver extends BroadcastReceiver{ 
    @Override 
    public void onReceive(Context context, Intent intent) { 


     String ns = Context.NOTIFICATION_SERVICE; 
     NotificationManager mNotificationManager = (NotificationManager) context.getSystemService(ns); 

     int icon = R.drawable.icon; 
     CharSequence tickerText = "Votre vidange approche"; 
     long when = System.currentTimeMillis(); 

     Notification notification = new Notification(icon, tickerText, when); 


     CharSequence contentTitle = "Notification"; 
     CharSequence contentText = "Vérifier votre kilométrage"; 
     Intent notificationIntent = new Intent(context, Acceuil.class); 
     PendingIntent contentIntent = PendingIntent.getActivity(context, 0, notificationIntent, 0); 

     notification.setLatestEventInfo(context, contentTitle, contentText, contentIntent); 

     final int HELLO_ID = 1; 

     mNotificationManager.notify(HELLO_ID, notification); 
    } 

    } 

而這個功能在其他類推出這個以前的類:

public void repeating() { 
     AlarmManager mgr=(AlarmManager)context.getSystemService(Context.ALARM_SERVICE); 
     Intent i=new Intent(context, OnAlarmReceiver.class); 
     PendingIntent pi=PendingIntent.getBroadcast(context, 0, i, 0); 
     mgr.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime(), 1800000, pi); 

    } 

我將它推出每半小時通知,但我從來沒有它。 這段代碼是怎麼回事?

非常感謝。

回答

1

SystemClock.elapsedRealtime()意味着'現在'達到毫秒,所以有可能當它有機會運行時,triggerAtTime已經過去了(不知道AlarmManager如何處理這種情況)。嘗試延遲幾秒鐘,看它是否正常運行:SystemClock.elapsedRealtime() + 10 * 1000

另一方面,重複間隔很大的時間間隔(如天)的警報是不可靠的:如果你處理死亡,或拋出異常,或設備重新啓動,那麼它的警報將被清除。一個替代方案(儘管不是100%防彈)將安排來自前一個警報的每個下一個警報,並節省它運行到共享偏好的時間。然後,每次應用程序啓動時,檢查下一次運行時間是否有效(即將來),以及是否不安排新的警報。

+0

有很多筆記。謝謝你的回答。對於第二點,我不會以100%來表達它。它很難編碼。不是?加上我知道AlarmManager始終保持活動,儘管系統重啓。 :\ – androniennn

+0

好的,但我並沒有簡單說明這個「訣竅」:\。如果可以的話,你可以寫一些你的vue點的簡單代碼嗎? – androniennn

+0

30分鐘過去了,沒有inr通知。奇怪:\ – androniennn