我的问题一般是 - 如何使每个“INTERVAL”运行后台服务而不获取ANR消息(尝试从alarmManager调用服务启动线程来完成其工作)? 谢谢你的帮助!
更具体:
我正在创建一个类似DropBox的应用程序 - 让本地文件夹与其他Android手机共享。
此应用程序应在后台运行。
它也应该在一些时间间隔内运行,以检查是否在本地目录中创建了任何新数据,以便将其上传到某个服务器。
我的应用程序通常会执行PsudoCode中的下一个序列:
1) AlarmManager.setInexactRepeating(MySerVice)
2) (when the service is being called) DecideWhichFileToUploadOrDownload()
3) UploadNewFiles() DownloadNewFiles()
我知道问题出在第3阶段,在上传/下载超过10秒后,我收到ANR消息(或我的应用程序被杀),如果上传/下载时间比所有时间短10秒工作得很好。 我尝试创建一个可以上传/下载的线程,但是一旦服务完成,Android就会杀死我的线程。
答案 0 :(得分:2)
如何使每个“INTERVAL”运行后台服务而不获取ANR消息
使用IntentService
,以便在后台线程上完成工作。
我尝试创建一个可以上传/下载的线程但是一旦服务完成,Android就会杀死我的线程。
这就是为什么你应该使用IntentService
,因为Android管理后台线程并为你停止Service
。您只需通过startService()
发送内容,然后在onHandleIntent()
中完成工作。
答案 1 :(得分:1)
当您的服务(由Alarm服务调用)执行可能需要长时间执行和/或异步的事情时,您不要忘记使用IntentService或您拥有线程消息服务
和 WakeLock(参见PowerManager)
否则设备可能返回/进入“深度睡眠”状态..然后CPU状态为fronzen直到下一个“事件”
尽快在您的服务中获取WakeLock,并确保在后台工作结束时发布它......