我在我的代码中设置闹钟,以便在特定时间内完成 警报机制适用于SDK<但是在19日,警报没有被解雇 这是我设置闹钟的代码:
public void SetAlarm(Context context, Long executionTime)
{
AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(context, AlarmReciever.class);
PendingIntent pi = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
// Only one alarm can live, so cancel previous.
am.cancel(pi);
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {
am.set(AlarmManager.RTC_WAKEUP, executionTime, pi);
} else {
setAlarmFromKitkat(am, executionTime, pi);
}
}
由于我使用Service
设置闹钟,因此我使用GetApplicationContext()
作为上下文。
onReceive()
代码:
@Override
public void onReceive(Context context, Intent intent) {
for (SchedulerListener listener : listeners) {
listener.fetchAndRebuildNotification();
}
}
以下是BroadcastReceiver
:
<receiver
android:name="com.SagiL.myAppName.BroadCastReceivers.AlarmReciever" />
回调在服务中运行一个方法(当警报发生时它仍处于活动状态,注意它不会启动它。)
整个事情是library
在我的应用程序中使用,在那里我以相同的方式声明接收器。
有时警报会发射一次,但大多数情况下它根本不发射。
有没有人经历过这样的事情?
我无法相信SDK 19很常见,因为许多应用程序都在使用AlarmManager
,如果它们很常见,它们也会破坏。
答案 0 :(得分:10)
我的申请遇到了类似的问题。我发现使用0
广告getBroadcast(...);
中的ID并没有很好地发挥作用并导致很多问题。
尝试将id
从0
更改为闹钟的真实身份。
自:
PendingIntent pi = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
要:
PendingIntent pi = PendingIntent.getBroadcast(context, id, intent, PendingIntent.FLAG_UPDATE_CURRENT);
答案 1 :(得分:7)
这是一个迟到的答案,但可能有所帮助。在Android KitKat 4.4.xx中集成了电池管理器(我的设备:华为Ascend Mate 7)。可以选择在电池管理器中杀死应用程序的后台进程和服务。不知道这些选项是否与德语选项类似,所以请尝试:
这听起来很简单,但这确实是我的问题。在带有ICS的三星Galaxy S3上,一切都像是一种魅力。但是用Android 4.4.2购买了一台新设备huawei,突然我的应用程序报警无法正常工作。检查系统后,我检测到该选项,启用了我的应用程序,现在一切正常。并非一切都是编程答案:)。
由于这个答案已经完成,Android中发生了很多事情。对于每个有类似问题的人:自从更新到Marshmallow后,有两个问题:第一个是如上所述,第二个是打盹模式:
某些设备,如我的华为Ascend Mate 7,使用两种节能方法。因此,做上述内容还不够。此外,您必须将应用列入白名单,并使用新的alarmManager
方法setAllowWhileIdle()
,setExactAndAllowWhileIdle()
和setAlarmClock()
。
通过将您的应用白名单,您必须告诉用户。您可以在启动应用时使用简单信息执行此操作,例如AlertDialog
和/或您可以使用ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS
intent
启动白名单屏幕。但请注意此操作,因为正如一些开发人员所报告的那样,Google可以暂停正在调用此操作的Playstore中的应用程序。
setAlarmClock
也应该有用,但如果你这样做,闹钟图标就在顶部。
我已经对新记录的打盹模式进行了一些测试,并发现它通常有效。但是,如果没有白名单,应用程序将进入待机状态并且'alarmManager'不会再触发,也不会使用新方法。我测试了一晚,应用程序在大约一小时内发送到待机状态。在白天的正常情况下,用户处于活动状态并且经常移动他的设备,它可以在没有白名单的情况下工作。