即使应用关闭,也可以使用闹钟管理器吗?

7

我将使用 Alarm Manager 来更新小部件,需要借助一个 Service。我有两个不同的问题。

第一个问题:我正在使用 Alarm Manager 的 intent 调用服务,如下所示:

alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
Intent i = new Intent(context, MyService.class);
pi = PendingIntent.getService(context, 0, i, PendingIntent.FLAG_UPDATE_CURRENT);

context.startService(new Intent(context, MyService.class));

Long repeat = Long.parseLong(prefs.getString("update_preference", "600"));
alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP, Calendar.getInstance().getTimeInMillis(), 1000*repeat, pi);

这有问题吗?

看起来和使用都没问题。但是当我查看正在运行的服务时,却没有看到我的服务名称在列表中。也许它不是以单独的服务运行的。只看到应用程序名称(而不是作为服务运行)。我不确定如何分离或是否有影响?

另一个问题:长时间运行的应用程序控制小部件更新,会被手动关闭或任务管理器关闭。当然,Alarm Manager会停止并且小部件的功能也会停止,比如按钮点击。

但是 Twitter 解决了这个问题。当小部件处于活动状态时,如果我关闭主应用程序(Twitter)- 控制小部件 - 然后点击小部件,一些方式能够触发小部件应用程序并且它能够正常启动。所以按钮正常工作。这怎么可能呢?

任何帮助都将不胜感激。

2个回答

3

如果您想让服务在第一次立即运行,请设置当前时间并从当前时间开始设置间隔,无需执行context.startservice,这就是pending intent的作用。

当您不需要时,您也设置了2种不同类型的重复,setRepeating是严格的,而setInexact不是严格的,当它被触发时可以由操作系统进行调整,因此其中有inexact。您只需要选择其中一个而不是两个。

此外,这些时间间隔非常短,会显著消耗电池电量。

代码应该只包含如下内容:

alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
Intent i = new Intent(context, MyService.class);
pi = PendingIntent.getService(context, 0, i, PendingIntent.FLAG_UPDATE_CURRENT);

Long repeat = Long.parseLong(prefs.getString("update_preference", "600"));
alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP,
                      Calendar.getInstance().getTimeInMillis(), 1000*repeat, pi);

尽管如此,您仍不需要使用context.startService,因为PendingIntent将启动服务。 - tyczj
首先,我的小部件从任何服务器获取数据。您确定不需要使用服务吗?我应该在Widget类中使用update函数吗?您能给出使用示例吗?谢谢。 - Ogulcan Orhan
我并不是说某个服务是不必要的,我的意思是你无需像现在这样启动它,当 AlarmManager 触发时,挂起的意图会启动该服务。 - tyczj
好的,你是对的,那段代码启动了两次服务。只需要startService这一行就可以了。谢谢。 - Ogulcan Orhan
你有关于下一个问题的建议吗?如果我对那个问题有清晰的想法,我就会接受答案。再次感谢。 - Ogulcan Orhan
我还没有涉及到小部件,所以无法回答那个问题,抱歉。 - tyczj

1

你的应用程序/服务不必一直运行,这是很好的。 事实上,它并不需要一直运行以更新小部件。如果你使用AlarmManager调度一个Intent,当Intent被触发时,如果应用程序已经关闭,它将重新启动。


明白了,谢谢。但是如果持有闹钟管理器的应用程序被手动关闭或被某些“杀手”关闭,会怎么样呢? - Ogulcan Orhan
AlarmManager没有在您的应用程序中运行。如果您的应用程序被终止,也不会有任何问题,因为当服务意图被启动时,它将由操作系统重新启动。 - lujop
好的,你的意思是当时间间隔结束时,服务会重新启动。但是如果应用程序关闭,点击事件仍然无法工作。这就是为什么我应该立即重新启动服务的原因。但是不知道如何做到这一点。 - Ogulcan Orhan
如果点击事件需要启动服务,则处理点击事件的处理程序必须启动服务。 - lujop
有任何片段或示例吗? - Ogulcan Orhan

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