Android alarmmanager不是很可靠

我遇到了
Android的Alarmmanager功能问题.

问题是有超过一个小时左右等待无法启动的警报.

我的应用程序最初创建一个类似的警报: –

PendingIntent sender = PendingIntent.getBroadcast(this, 192837, intent, PendingIntent.FLAG_UPDATE_CURRENT);

AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
             am.set(AlarmManager.RTC_WAKEUP, mCal.getTimeInMillis(), sender);

当闹钟响起时,它会触发我的RecieverHandler类,特别是这个函数: –

public void onReceive(Context context, Intent intent) 
    {
        try {
             Bundle bundle = intent.getExtras();


             Intent newIntent = new Intent(context, MessageDispatcher.class);
             newIntent.putExtras(bundle);
            // newIntent.addFlags(Intent.FLAG);
             context.startService(newIntent);



            } catch (Exception e) {
             Toast.makeText(context, "There was an error somewhere, but we still received an alarm", Toast.LENGTH_SHORT).show();
             e.printStackTrace();

            }


    }

然后,它将以MessageDispatcher的名称启动服务,并调用此函数: –

public int onStartCommand(Intent intent, int flags, int startId)

这个函数从我的数据库中获取下一个闹钟时间,我确信它正常工作,然后根据数据库中的日期设置一个新的闹钟,如:

PendingIntent sender = PendingIntent.getBroadcast(this, 192837, newIntent, PendingIntent.FLAG_UPDATE_CURRENT);


    AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
        am.set(AlarmManager.RTC_WAKEUP, mCal.getSendAt().getTimeInMillis(), sender);

这会为下一条消息创建警报.

我已经在很短的时间内对它进行了测试,它似乎可以正常工作,并通过更改手机中的日期和时间对其进行了大量测试.它似乎成功发射.

然后,当此警报响起时,它将获得下一个警报,并安排此计划.我几乎100%确定这些部件工作正常.

所以我只关注为什么它不起作用的一些理论.

我认为这可能与我断开手机与调试器的连接有关,但在这种情况下,警报似乎可以在很短的时间内完成.

所以我的主要理论是我创建的闹钟管理员在一段时间后被删除了?如果这是真的,那么这是一个很大的问题,因为无论经过了多长时间,我都需要这样做.

非常感谢任何有助于确保我的警报的帮助,谢谢.

最佳答案

So my main theory is that the alarmmanager I am creating is being deleted after a certain amount of time?

注册的警报会一直注册,直到您取消它们,或者直到下次重新启动,或直到用户在Android 2.1及更早版本中使用“任务杀手”杀死您的应用程序.

你没有说明:

>你如何确定警报是否“熄火”
> BroadcastReceiver正在做什么

没有这些信息,就不可能说出错的地方.

确保您在BroadcastReceiver中完成所有工作(如果工作非常快)或者在将控制权传递给正在完成其余工作的IntentService时维护自己的WakeLock.查看WakefulIntentService以获取更多信息.

此外,您可能尝试为每个警报创建唯一的Intent,而不是更新当前警报.我不知道这里有一个特别的问题,但它让我感到紧张.

点赞