1. 程式人生 > >不要在廣播的onReceive()方法中執行耗時操作

不要在廣播的onReceive()方法中執行耗時操作


不要在onReceive()方法中新增過多的邏輯或執行耗時操作,因為onReceive()方法執行在主執行緒中,耗時操作會導致ANR。

同時,廣播接收器中不允許開啟子執行緒:
對於靜態註冊的廣播接收器來說,廣播接收器物件的生命週期較短,執行完onReceive()方法就會變為垃圾物件而被回收,在子執行緒執行完之前,若對應的Activity退出,他們所在程序就變成了空程序(沒有任何活動元件的程序),系統需要記憶體時可能會優先終止該程序,程序被終止,其內的子執行緒也會被終止,導致子執行緒無法執行完。

對於動態註冊的廣播接收器來說,Activity退出時會呼叫unregisteReceiver()方法執行解註冊,此時廣播接收器物件也會變成路徑物件而被回收。在子執行緒執行完之前,對應的Activity退出,同樣它們所在程序就變成了空程序,其內的子執行緒也無法執行完。

如果必須執行耗時任務可以考慮,在onReceive中開啟服務來執行。系統就會認為這個程序裡還有其他活動元件在執行,就不會任意時刻回收此程序。