7

我正在使用一个Alarm Manager来更新一个带有Service. 我有两个不同的问题。

第一个问题:我以警报管理器的意图调用该服务。像这样:

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)而不是单击小部件,以某种方式触发小部件的应用程序,它会重新启动。所以按钮工作正常。这怎么可能?

任何帮助,将不胜感激。

4

2 回答 2

3

您不需要context.startservice按照待处理的意图执行此操作,如果您希望服务第一次立即运行,只需将其设置为在当前时间运行,然后设置从当前时间开始的时间间隔。

当您不需要时,您还设置了 2 种不同类型的重复setRepeating是严格的哪里setInexact不是,并且可以在操作系统被触发时进行调整,因此不精确。你想要一个或另一个,而不是两者。

而且这些间隔非常小,它会显着杀死电池。

应该就是这个

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);
于 2012-05-08T20:26:44.933 回答
1

您的应用程序/服务并非一直在运行,这很好。事实上,它不需要/必须一直运行来更新小部件。如果您使用 AlarmManager 安排 Intent,如果 Intent 已关闭,则应用程序将在该 Intent 被触发时启动。

于 2012-05-08T20:23:19.770 回答