如果我的应用程序没有运行,AlarmManager会起作用吗?

11

我有一个闹钟,在与应用程序交互使用时可以正常工作,但如果我将它设置到第二天并且没有与我的应用程序进行交互,则无法工作。因此,我开始怀疑这是因为我的应用程序进程在那个时间不在运行。

这是我正在做的事情:

Calendar calSet = Calendar.getInstance();
calSet.set(Calendar.HOUR_OF_DAY, selectedhour);
calSet.set(Calendar.MINUTE, selectedminute);
calSet.set(Calendar.YEAR, year);
calSet.set(Calendar.MONTH, monthOfYear);
calSet.set(Calendar.DATE, dayOfMonth);
alarm = new Intent(ActivityA.this, Service.class);
pendingIntent = PendingIntent.getService(getApplicationContext(), i++,alarm, 1);
alarmanager.set(AlarmManager.RTC_WAKEUP, calSet.getTimeInMillis(),pendingIntent);

你解决了你的问题吗? - Erum
@ErumHannan 是的,它起作用了。实际上,在某个时间点我启动了我的设备,所以它没有工作。因此,为了使应用程序正常工作,我在bootcomplete广播上重新初始化了闹钟。就这样。 - Shakeeb Ayaz
4个回答

15

来自AlarmManager

AlarmManager提供了访问系统闹钟服务的功能。这些服务允许您安排应用程序在将来的某个时间运行。当闹钟响起时,系统会广播已为其注册的Intent,如果目标应用程序尚未运行,则自动启动它。在设备休眠时,已注册的闹钟会被保留(并且可以选择在此期间唤醒设备),但如果设备关闭并重新启动,则会清除它们。


简而言之,在设备重启之前都会运行。

您可以阅读Android AlarmManager after reboot,其中@CommonsWare给出了一个链接,该链接指向他的示例应用程序,即使设备重启后也会保留闹钟。


请忽略以下部分,它似乎无效。我将在将来删除它

您可以阅读How to create a persistent AlarmManager,以及How to save Alarm after app killing?可以让您了解如何处理此问题(在应用程序被杀死时保留闹钟)。.


我确定设备没有重新启动..你所说的“应用程序已被杀死”是什么意思,能详细说明一下吗? - Shakeeb Ayaz
如果您从最近列表或应用程序管理器中删除了一个应用程序,则会杀死该应用程序。这意味着您已经强制停止了该应用程序。然后,您的应用程序的AlarmManager已被移除。因此,唯一摆脱这种行为的方法是“在应用程序启动时重置闹钟”。 - Pankaj Kumar
1
@AhmedM "它会一直运行,直到你的应用程序被杀死" 这意味着当使用强制停止应用程序时。这并不意味着您的应用程序已进入后台。如果还有更多困惑,请告诉我。 - Pankaj Kumar
嗯,我不确定你在哪里看到它说AlarmManager会在应用程序被杀死时删除你的闹钟。我正在测试中杀死应用程序,但没有这样的问题。文档只说明在手机重启时AlarmManager会被清除。 - Aaron Smentkowski
1
不是在寻找另一个问题,而是试图为这个问题提供更好的建议,因为我被这个答案误导了,认为当我的应用程序被杀死时,我的警报会被删除,但事实并非如此,从我所知道的情况来看,也没有文档来支持这一点。这就是为什么我在这里发布了我的答案以进行详细说明。 - Aaron Smentkowski
显示剩余7条评论

3

是的,它起作用了,但需要正确理解,请参阅文档。

注意:Alarm Manager用于在特定时间运行应用程序代码的情况,即使您的应用程序当前没有运行。对于正常的定时操作(滴答声、超时等),使用Handler更容易、更高效。

请参阅此处http://developer.android.com/reference/android/app/AlarmManager.html


3

查看AlarmManager文档..

http://developer.android.com/reference/android/app/AlarmManager.html

我没有看到任何地方说明杀死你的应用程序将删除该应用程序安排的所有警报。更具体地说,它指出如果您的应用程序未启动,则会为您启动它。

我进行了自己的测试,并可以验证此内容..

  • Setting an alarm 5 sec in the future.
  • Then closing app from recents.
  • Then watching logs for my broadcast to be received.
  • Keeping in mind this was done with a signed apk.

    Calendar cal = Calendar.getInstance();
    cal.add(Calendar.MILLISECOND, 5000);
    
    AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
    alarmManager.set(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), pendingIntent);
    

我还要记住Pankaj Kumar提到的关于启动时重新设置闹钟的事情。这是你需要自我保护的地方,因为AlarmManager在设备重启时会清除所有闹钟。


1
@tej shah Lenovo手机上是否有后台服务的设置?我认为这种情况在手机制造商中可能经常出现,但这是处理我的Android的推荐方式。因此,如果有OEM设置或他们更改了其工作方式的设置,您将不得不与他们合作解决。 - Aaron Smentkowski
这个问题的最佳答案是什么? - user7615935

2

我们需要在应用管理器中启用自启动管理器来启用我们的应用,一些手机如Vivo v5。

在Vivo v5中,我们可以在以下菜单中找到:

iManager > App Manager > Auto Start Manager > Enable our app here. 

如果应用程序被关闭或杀死,您的闹钟/闹钟管理器将会触发警报。请注意,HTML标签将被保留。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接