2013-03-17 68 views
0

我有一個IntentService,它是從BroadcastReceiver啓動的,啓動服務,服務地址爲。當我在BroadcastReceiver中獲得新信息時,新的信息將通過startService(服務)的意圖再次推送到IntentService,但隨後服務將重新啓動。我能阻止這個嗎?我想將新信息推送到IntentService而不用重新聲明它。阻止服務重新啓動

+0

所以你想'IntentService'不像'IntentService'那樣工作嗎? – 323go 2013-03-17 16:45:33

+0

我嘗試了一個正常的服務,但後來我有ANR的問題,所以我切換到一個IntentService。正常的服務是完美的,只有ANR是問題...所以我能做什麼? IntentService和普通Servic的主要區別在於IntentService有一個WorkerThread,對嗎?我也可以在普通服務中這樣做嗎?我應該如何啓動WorkerThread,然後是否有新的Intent進入服務? – Cilenco 2013-03-17 17:30:43

+0

你在'onHandleIntent'或'onStartCommand'中實現了你的代碼嗎? – 323go 2013-03-17 17:45:09

回答

0

我假設你需要分享一些狀態來處理你的服務中的後續意圖。我看到兩種解決方案:

  1. 使用IntentService並在onHandleIntent中保存和恢復此狀態。
  2. 使用啓動的Service,並將此狀態作爲Service類中的字段保存。爲了防止ANR,在UI線程之外處理Intents,就像IntentService does一樣。要使服務保持運行,只需從handleMessage中刪除stopSelf呼叫。

如果您可以避開每個經過處理的Intent的恢復和保存狀態,則第一種解決方案更安全,因爲您的服務在內存不足時可能會被OS終止。

+0

'處理UI線程之外的意圖'我應該怎麼做? – Cilenco 2013-03-18 23:33:35

+0

查看IntentService實現(鏈接在我的答案中)以查看如何完成。既然你不希望你的服務在所有的Intents被處理後停止,不要調用stopSelf()(在我的答案中也提到)。 – chalup 2013-03-19 21:15:35

1

意向服務旨在以意向開始,執行他們的工作並完成。從這個角度來看,它們更像是一個異類。這就是您的intentservice重新啓動的原因。

onHandleIntent應該做一些工作並完成。你可以做一些技巧來阻止它,但這會違背意圖服務的性質。

你應該做的是有一個經典的服務。如果你得到ANR錯誤,你應該在一個線程內執行所有的時間密集型操作,或者在服務內部託管一個async服務器。

+0

如果我使用正常的服務,'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

+0

我想說,你總是可以依靠onStartCommand來獲得調用(第一次)。如果您正在執行ANR錯誤,那麼您需要在那裏執行一些時間密集型操作,您需要識別它們並放入另一個線程中。如果你不確定它們是哪一個,你可以啓用strictusermode – fedepaol 2013-03-18 22:17:57

+0

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

相關問題