我需要在Android手机上运行一个24*7的后台服务,并在开始&在手机电池电量低的情况下,每隔1小时访问一次web服务。你能给我一些建议吗?我试着读了几篇文章,但没有得到任何想法。我知道这里我需要粘贴一些代码后尝试一些东西。但我没有得到任何线索。请告诉我怎么接近?
您可能需要使用startForeground(int id, Notification notification)
方法来防止系统杀死您的Service
,如下所示:
一个已启动的服务可以使用start前台(int, Notification) API将服务置于前台状态,在这种状态下,系统认为它是用户主动意识到的东西,因此在内存不足时不会被杀死。(理论上仍然有可能在当前前台应用程序的极端内存压力下杀死服务,但在实践中这不应该是一个问题。)
那么你需要某种计划任务每小时运行一次。像ScheduledThreadPoolExecutor
这样的东西对于这个目的是理想的,使用scheduleAtFixedRate (Runnable command, long initialDelay, long period, TimeUnit unit)
方法。
每小时需要完成的任务必须作为Runnable
执行并提交给您的ScheduledThreadPoolExecutor
:
ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor( 1 );
executor.scheduleAtFixedRate( new MyRunnableTask(), 0, 1, TimeUnit.HOURS );
Runnable
任务应该是这样的:
private class MyRunnableTask implements Runnable {
public void run() {
//Do what needs to be done.
}
我需要在Android手机上运行一个24*7的后台服务
请不要。对于初学者来说,这是不可能的。
用户经常大声抱怨那些"24*7运行"的服务,因为这些服务毫无价值地占用了系统资源(例如RAM)。结果,在第三方任务杀手和设置中的强制停止选项之间,用户摆脱了这些服务。当它们这样做时,特别是在Android 3.1+上,你的应用程序将不会再运行,直到用户从启动器手动启动你的活动。
Android自己也会放弃这些服务,因为太多的开发者在服务管理上太草率了。
And on Start &手机电量低,每隔1小时点击一次webservice
基于这个列表,你不需要"在Android手机上运行一个24*7的后台服务"。你需要做的工作:
- 设备启动时
- 设备电量不足时 每小时
您可以通过ACTION_BOOT_COMPLETED
广播Intent
发现设备何时启动。您可以通过ACTION_BATTERY_LOW
广播Intent
发现设备的电池电量不足。您可以通过AlarmManager
找到时间流逝的时间,您可以在其中建立自己的闹钟时间表(例如,每小时)。
这三个触发器都应该在IntentService
上调用startService()
。IntentService
将允许您通过其内置的后台线程"命中web服务"。并且,当该工作完成时,IntentService
将消失,因此您不会一直占用内存。
并且,如果你想在每小时的条件下唤醒设备的睡眠模式,你可能需要使用像我的WakefulIntentService
这样的东西,否则设备可能会在你试图"点击Webservice"时重新进入睡眠状态。
这样,您的服务只在运行并占用资源时才会主动向用户传递价值。当它只是在等待其他事件发生时(例如,接下来的59分钟),它不会运行并占用资源。