2016-12-03 116 views
0

我想在Android Studio中開發一個簡單的鬧鐘應用程序,但我無法正確計算如何使用AlarmManagerBroadcastReceiverAndroid Studio鬧鐘服務未自動啓動

在我MainActivity我已經實例化一切,我需要爲AlarmManagerIntentPendingIntent,和我使用的是日曆保持從TimePicker接收的時間)。我有一個按鈕的onClick事件此行

alarmManager.set(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), pendingIntent); 

接收器被稱爲AlarmReceiver並在其onReceive()我有,就目前而言,

Toast.makeText(context, "I'm running", Toast.LENGTH_SHORT).show(); 
Log.e("Receiver", "Receiver entered"); 

出於測試目的,我設定鬧鐘時間是一個每當我調試應用程序時,從當前時間開始分鐘。設置好時間後,我按下設置AlarmManager的按鈕。一旦時間成爲鬧鐘時間,Toast消息和日誌消息就不會自行顯示。當時間在鬧鐘時間的分鐘之內時,只有按下按鈕纔會顯示。

例如,如果鬧鐘時間是3:00,當前時間是2:59,並且我已按下按鈕以設置AlarmManager。當它變成3:00時,消息不顯示。他們只會在3點鐘之內按下按鈕纔會顯示。

這是正常的行爲?如果是這樣,我應該如何設置它,以便一旦設置了所有信息就會自動顯示消息,以便以後可以將其擴展爲鈴聲?

我已經確保了時間值是正確的,該接收機在manifest

+0

您是否傳遞意圖啓動服務? – Dhruv

+0

是的,我做到了。我已經添加了一個服務來播放用於測試目的的mp3文件。問題在於,當前時間處於鬧鐘時間時,它仍未自動啓動。我必須按下按鈕 – bitscuit

回答

0

嘗試指定這樣的事情:

private static void setUpAlarm(final Context context, final Intent    intent, final int timeInterval){ 
final AlarmManager am = (AlarmManager)  context.getSystemService(Context.ALARM_SERVICE); 
final PendingIntent pi = PendingIntent.getBroadcast(context, timeInterval, intent, 0); 
am.cancel(pi); 
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) 
{ 
    final AlarmManager.AlarmClockInfo alarmClockInfo = new AlarmManager.AlarmClockInfo(System.currentTimeMillis() + timeInterval, pi); 
    am.setAlarmClock(alarmClockInfo, pi); 
} 
else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) 
    am.setExact(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + timeInterval, pi); 
else 
    am.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + timeInterval, pi); 
} 
+0

你錯了。此代碼不處理新的API – Vyacheslav

+0

更多'setAlarmClock'真的很糟糕 – Vyacheslav

0

我真的建議使用此代碼:

int currentapiVersion = android.os.Build.VERSION.SDK_INT; 
    if (currentapiVersion < android.os.Build.VERSION_CODES.KITKAT){ 
     am.set(AlarmManager.RTC_WAKEUP, nexttime, pi); 
    } else if (currentapiVersion < android.os.Build.VERSION_CODES.M) { 
      am.setExact(AlarmManager.RTC_WAKEUP, nexttime, pi); 
     } else { 
      am.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, nexttime, pi); 
     }