2016-12-03 120 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); 
     }