1. 程式人生 > >為什麼不能在BroadcastReceiver中開啟子執行緒

為什麼不能在BroadcastReceiver中開啟子執行緒

  當一個廣播訊息被Receiver監聽到時,Android會呼叫它的onReceive()方法,並將包含訊息的 Intent物件傳給它處理, onReceive() 方法的執行時間不能超過10 秒,否則會導致ANR。

  那麼,相信很多人在這裡跟我有同樣的疑惑:此時直接在Broadcast Receiver中啟動子執行緒來處理耗時任務不行嗎?

  這種方式不能說不行,只能說不可靠,Receiver只在onReceive方法執行時是啟用狀態,只要onReceive一返回,Receiver就不再是啟用狀態了。由於activity可能會被使用者退出,Broadcast Receiver的生命週期本身就很短,可能出現的情況是: 在子執行緒還沒有結束的情況下,Activity已經被使用者退出了,或者BroadcastReceiver已經結束了。在Activity已經退出、BroadcastReceiver已經結束的情況下,此時它們所在的程序就變成了空程序(沒有任何活動元件的程序),系統需要記憶體時可能會優先終止該程序。如果宿主程序被終止,那麼該程序內的所有子執行緒也會被中止,這樣就可能導致子執行緒無法執行完成.。

  這就帶來了一個問題:當響應一個廣播資訊的處理十分耗時的時候,那麼就應該把這個處理放在一個單獨的執行緒裡去執行,來保證主執行緒裡的其他使用者互動元件能夠繼續執行,而一旦這麼做,當onReceive()喚起一個執行緒後就會馬上返 回,這時就會把Receiver程序放到被終止的境地。解決這個問題的方案是在onReceive()裡開始一個Service,讓這個Service去 做這件事情,那麼系統就會認為這個程序裡還有活動正在進行。推薦使用IntentService。