我有一个IntentService,它是从BroadcastReceiver启动的,启动服务,服务地址为。当我在BroadcastReceiver中获得新信息时,新的信息将通过startService(服务)的意图再次推送到IntentService,但随后服务将重新启动。我能阻止这个吗?我想将新信息推送到IntentService而不用重新声明它。阻止服务重新启动
阻止服务重新启动
回答
我假设你需要分享一些状态来处理你的服务中的后续意图。我看到两种解决方案:
- 使用IntentService并在onHandleIntent中保存和恢复此状态。
- 使用启动的Service,并将此状态作为Service类中的字段保存。为了防止ANR,在UI线程之外处理Intents,就像IntentService does一样。要使服务保持运行,只需从handleMessage中删除stopSelf呼叫。
如果您可以避开每个经过处理的Intent的恢复和保存状态,则第一种解决方案更安全,因为您的服务在内存不足时可能会被OS终止。
意向服务旨在以意向开始,执行他们的工作并完成。从这个角度来看,它们更像是一个异类。这就是您的intentservice重新启动的原因。
onHandleIntent
应该做一些工作并完成。你可以做一些技巧来阻止它,但这会违背意图服务的性质。
你应该做的是有一个经典的服务。如果你得到ANR错误,你应该在一个线程内执行所有的时间密集型操作,或者在服务内部托管一个async服务器。
如果我使用正常的服务,'onStart'方法只在第一次被调用,而我只在第二次调用'context.startService(service)'时调用'onStartCommand'方法,对吗?在'onStartCommand'方法中,我只有这个代码'final Bundle extras = intent.getExtras(); String string1 = extras.getString(“string1”); String string2 = extras.getString(“string2”);通知nf =新通知(string1,string2); data.add(NF); adapter.notifyDataSetChanged();'它把一个新的项目给我的listView。这需要很多时间吗? – Cilenco 2013-03-18 22:07:28
我想说,你总是可以依靠onStartCommand来获得调用(第一次)。如果您正在执行ANR错误,那么您需要在那里执行一些时间密集型操作,您需要识别它们并放入另一个线程中。如果你不确定它们是哪一个,你可以启用strictusermode – fedepaol 2013-03-18 22:17:57
StrictMode只会说'03-18 23:58:28。494:D/StrictMode(15451):StrictMode策略违规; 〜duration:1481 ms:android.os.StrictMode $ StrictModeDiskReadViolation:policy = 31 violation = 2 03-18 23:58:28.494:D/StrictMode(15451):at android.os.StrictMode $ AndroidBlockGuardPolicy.onReadFromDisk(StrictMode。 java:1107) 03-19 00:01:50.234:D/StrictMode(15576):StrictMode策略违规; 〜duration:413 ms:android.os.StrictMode $ StrictModeDiskReadViolation:policy = 31 violation = 2 03-19 00:01:50.234:D/StrictMode(15576):at android.os.StrictMode $ AndroidBlockGuardPolicy.onReadFromDisk(StrictMode。 java:1107)' – Cilenco 2013-03-18 23:04:06
- 1. 重新启动服务器后重新启动WCF服务
- 2. MySql Notifier无法启动/停止/重新启动MySql服务
- 3. 阻止启动任务
- 4. Android重新启动服务
- 5. Android:Activity.onDestroy()重新启动服务
- 6. 从服务重新启动Windows服务
- 7. 重新启动服务器后无法启动SQL服务
- 8. 重新启动服务器后重新启动Docker容器
- 9. 阻止Google Play服务在应用启动时自动登录
- 10. Android:如何防止服务在崩溃后重新启动?
- 11. 如何停止并重新启动memcached服务器?
- 12. neo4j服务器没有重新启动或停止
- 13. 停止,快照并重新启动EBS服务器
- 14. 机架服务器能够停止并重新启动
- 15. 如何防止在Android中重新启动服务?
- 16. 如何停止phusion乘客产卵服务器重新启动?
- 17. 在Sublime Text 2中重新启动/停止nodejs服务器?
- 18. Windows服务不会停止并重新启动
- 19. 如何停止(并重新启动!)Tornado服务器?
- 20. 防止服务在Android中重新启动
- 21. Android服务经常停止并重新启动
- 22. Ansible停止服务,但不会重新启动它
- 23. 如何在系统重新启动时启动Windows服务停止事件?
- 24. 有没有办法从Eclipse启动/停止/重新启动REMOTE Tomcat服务器?
- 25. .NET Windows服务 - 通过服务重新启动获取更新
- 26. IIS重新启动Excel Web服务
- 27. Django重新启动服务器或httpd
- 28. Ansible并重新启动码头服务
- 29. 如何重新启动窗口服务
- 30. 重新启动TCP服务器
所以你想'IntentService'不像'IntentService'那样工作吗? – 323go 2013-03-17 16:45:33
我尝试了一个正常的服务,但后来我有ANR的问题,所以我切换到一个IntentService。正常的服务是完美的,只有ANR是问题...所以我能做什么? IntentService和普通Servic的主要区别在于IntentService有一个WorkerThread,对吗?我也可以在普通服务中这样做吗?我应该如何启动WorkerThread,然后是否有新的Intent进入服务? – Cilenco 2013-03-17 17:30:43
你在'onHandleIntent'或'onStartCommand'中实现了你的代码吗? – 323go 2013-03-17 17:45:09