2017-05-14 97 views
0

我遇到了Android AlarmManager的問題。我想每天早上00:01顯示通知。當我在白天的上午11:30進行通知測試時,通知確實顯示出來。但是當我在00:01測試它時,什麼都沒有顯示出來。Android AlarmManager不在夜間工作

我認爲這與我的手機在00:01上午幾小時無活動後睡着了,但我不確定。有沒有人有這個解決方案?提前致謝。

MainActivity:

Intent alarmIntent = new Intent(this, AlarmReceiver.class); 

    PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, alarmIntent, PendingIntent.FLAG_UPDATE_CURRENT); 

    AlarmManager manager = (AlarmManager) this.getSystemService(Context.ALARM_SERVICE); 

    Calendar calendar = Calendar.getInstance(); 
    calendar.setTimeInMillis(System.currentTimeMillis()); 
    calendar.set(Calendar.HOUR_OF_DAY, 0); 
    calendar.set(Calendar.MINUTE, 1); 

    Calendar now = Calendar.getInstance(); 
    now.setTimeInMillis(System.currentTimeMillis()); 

    if (calendar.before(now)) { 
     calendar.add(Calendar.DAY_OF_MONTH, 1); 

     manager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), 
       AlarmManager.INTERVAL_DAY, pendingIntent); 
    } else { 
     manager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), 
       AlarmManager.INTERVAL_DAY, pendingIntent); 
    } 

AlarmReceiver:

private static int NOTIFICATION_ID; 
    private NotificationManager notificationManager; 
    private PendingIntent pendingIntent; 

    Intent mIntent; 

    @Override 
    public void onReceive(Context context, Intent intent) { 

    NOTIFICATION_ID = random.nextInt(9999 - 1000) + 1000; 
    notificationManager = (NotificationManager) context.getSystemService(NOTIFICATION_SERVICE); 
    mIntent = new Intent(context, BirthdayActivity.class); 

    pendingIntent = PendingIntent.getActivity(context, NOTIFICATION_ID, mIntent, PendingIntent.FLAG_UPDATE_CURRENT); 

    NotificationCompat.Builder builder = new NotificationCompat.Builder(context); 

    builder.setContentTitle("Name"); 
    builder.setContentIntent(pendingIntent); 

    notificationManager = (NotificationManager) context.getSystemService(NOTIFICATION_SERVICE); 
    notificationManager.notify(NOTIFICATION_ID, builder.build()); 
} 

清單:

<receiver android:name=".utils.AlarmReceiver" android:enabled="true"> 
    </receiver> 

    <uses-permission android:name="com.android.alarm.permission.SET_ALARM"/> 
+0

什麼是你的「請勿打擾」設置設爲? – ProgrammersBlock

回答

0

我覺得everythi ng適合你的代碼。你可以在你的android studio終端上使用這個命令來檢查鬧鐘是否設置。 adb shell dumpsys alarms >dump.txt 然後在該文件中搜索您的軟件包名稱。這將確認您的鬧鐘設置是否成功。

接下來您使用的是setRepeating這意味着系統可以調整交貨時間。要在準確的時間使用setExact 這裏提供警報是從官方Android文檔一個摘錄:

注:爲API 19日,所有重複報警是不準確的。如果您的應用程序需要精確的交付時間,那麼它必須使用一次性精確警報,如上所述每次重新安排時間。

0

從API文檔:

注:爲API 19日,所有重複報警是不準確的。如果您的 應用程序需要精確的交貨時間,那麼它必須使用一次性的精確警報,每次重新計劃如上所述。傳統 targetSdkVersion早於API 19的應用程序 將繼續具有其所有警報,包括重複警報, 視爲確切。

https://developer.android.com/reference/android/app/AlarmManager.html#setRepeating(int, long, long, android.app.PendingIntent)

有你應該回答幾個問題。

  • 這是否確實需要精確?

  • 如果用戶在睡覺,可以等到他們喚醒手機嗎?

精確警報往往因爲他們忽視電話的狀態而不鼓勵。例如,當用戶甚至沒有看他們的手機時,它對用戶同步你的應用程序並不「好」。

如果您要連接到服務器並更新一些數據,我建議採用「推送」方式而不是「拉」方式。

0

他們的系統僅在將警報通知發送到AlarmReceiver時才能保持喚醒狀態。除非設備保持清醒狀態還有其他原因,否則在將意向傳送到活動之前,完全有可能它會回到睡眠狀態。

看一看WakefulBroadcastReceiver

+0

我嘗試過WakefulBroadcastReceiver,但它似乎不起作用。我發現在早上當我啓動應用程序時,鬧鐘消失了,需要重新設置。所以我需要一種方法來防止報警被刪除。 –

+0

警報不會被刪除。 ......並且,當你說「你嘗試了WakefulBroadcastReceiver但它不起作用」時,我不確定你的意思。你抓住了一個喚醒鎖?你必須持有一個喚醒鎖,直到你的活動開始。 –