Android的设计:后台长时间运行的服务或AlarmManager?(Android design

2019-07-21 18:35发布

我建立一个应用程序,它会定期监测电池状态,无线连接和位置数据,并会在文件中写的结果(和后来给他们开了个服务器)。 上安装应用程序的监测应禁用 - 但用户启用它应该生存重新启动。 大量的阅读后,我已经意识到我已经基本2种选择:

  • 子类Service以及从我的活动火它关闭。 将其放在前台,粘,什么不是,希望它不是由机器人杀死 - 如果机器人再现它照顾(实际上应该有3个服务,让他们之间的同步可能是混乱的)。 开始在服务线程(无需执行人我猜),并有它Thread.sleep(REGULAR_INTERVAL) 醒来后,收集数据并写入文件。 广播收集信息,如果它发生在运行(将已注册的广播接收器)对我的活动显示。 冲洗和重复while(true) 。 有办法打断这个
  • 有我的活动注册AlarmManager一个的PendingIntent - 将运行每REGULAR_INTERVAL。 我还没有研究这种方法的技术细节了这么多 - 但我希望我将能够使这个的PendingIntent创建和运行IntentService(这似乎走的路 - 具有用于螺纹机械自由以及关闭在其自己的)。 这种方法的一些框架代码将受到欢迎。

我想我必须注册在这两种情况下启动接收器检查共享偏好(已经做到了这一点),并在案件1日开始,而服务(S)的情况下,2寄存器的报警事件的接收器,并设置报警经理了 - 这是我需要一些骨架代码的一部分。

所以 - 我之前开始建造这一点 - 这将是首选的方法?

在回顾 - 应用程序应该监控手机的一些特性,直到用户选择关闭它并写入文件。

Answer 1:

而在情况2注册该报警事件接收器和设置报警管理器向上

您的接收器将已经通过清单登记。

这将是优选的方法?

AlarmManager ,假设REGULAR_INTERVAL通常体面长(例如,在几分钟内)。 理想地,该时间间隔是用户可配置的。

如果你打算当设备在其他睡眠要做到这一点,甚至,你的选择#1是行不通的,除非你保持WakeLock在所有的时间,这将导致你的用户要拍你的脸用猎枪。

这种方法的一些框架代码将受到欢迎。

下面是一个示例应用程序演示如何使用的AlarmManager用于非_WAKEUP报警(即,您只需要这些事件,而该设备已经醒了因其他原因发生)。

下面是一个示例应用程序演示如何使用的AlarmManager_WAKEUP报警,用我的WakefulIntentServiceWakefulIntentService (或类似的东西),因为需要AlarmManager不留设备清醒很长(只是足够长onReceive() A的BroadcastReceiver ),所以你需要采取额外的步骤,以保持设备清醒足够长的时间让你做你的工作。 从理论上讲 ,你的工作可能是速度不够快做只是onReceive() A的BroadcastReceiver ,避免了需要与混乱WakefulIntentService 。 然而,你会做磁盘I / O的每个时代,在理想情况下应该不是主要的应用程序线程来完成,其中onReceive()被调用。 而且,当你去上传你的数据,你可能需要一个WakefulIntentService那么,无论如何,如果你正在寻找这样做的背景,以及。



Answer 2:

使用第二个选项,并应使用intentService + AlarmManager看到这个例子http://www.dotkam.com/2011/01/10/android-prefer-alarms-and-intent-receivers-to-services/



Answer 3:

根据定期任务的长度,你可以选择几种方法之一。 这个问题讨论了他们- 计划在Android的经常性任务

使用AlarmManager时任务睡眠时间为15分钟或更长的方便。 该图案是公知的。



文章来源: Android design : background long running service or AlarmManager?