我有一個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. Init.rc:服務中止並重新啓動
- 2. 重新啓動服務器後重新啓動WCF服務
- 3. Java應用程序在JRE更新後阻止服務器重新啓動
- 4. 通過Nagio重新啓動/停止/啓動服務
- 5. MySql Notifier無法啓動/停止/重新啓動MySql服務
- 6. 阻止啓動任務
- 7. 重新啓動Unix服務
- 8. Android:Activity.onDestroy()重新啓動服務
- 9. Android重新啓動服務
- 10. Windows服務 - 重新啓動?
- 11. Windows服務重新啓動
- 12. 重新啓動服務
- 13. 從服務重新啓動Windows服務
- 14. Wix,Windows安裝程序重新啓動管理器阻止服務卸載?
- 15. 與gps服務的Android應用程序阻止設備,直到重新啓動
- 16. 重新啓動後阻止USB_DEVICE_ATTACHED啓動應用程序
- 17. 如何重新啓動服務器後重新啓動RoR服務
- 18. 重新啓動服務器後無法啓動SQL服務
- 19. 重新啓動服務器後重新啓動Docker容器
- 20. Mule Batch - 如何在服務器重新啓動時停止自動重啓?
- 21. 通過服務重新啓動活動
- 22. 阻止在Visual Studio 2017中自動啓動WCF服務主機
- 23. 阻止Google Play服務在應用啓動時自動登錄
- 24. Android服務經常停止並重新啓動
- 25. Windows服務不會停止並重新啓動
- 26. 在Sublime Text 2中重新啓動/停止nodejs服務器?
- 27. 不能停止/重新啓動的Apache2服務
- 28. 的getElementsByTagName(「A」)停止服務器重新啓動後,工作
- 29. neo4j服務器沒有重新啓動或停止
- 30. 停止,快照並重新啓動EBS服務器
所以你想'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