為什麽不取消註冊BroadcastReceiver會導致內存泄漏
阿新 • • 發佈:2017-08-24
tro 什麽 roi sta 還得 -c 交流 span 筆記 原始問題是這樣:然後扔到了很多Android開發交流群裏。接著產生了很多的見解,我感覺比較靠譜的有以下:
1、onDestroy被回調代不代表Activity被回收了?官方是這麽說的
網友1:代表【將】被系統回收,具體什麽時候回收看系統
網友2:app退出時,並不清理其所占用的內存,你調gc只是建議,幹不幹還得看gc自己(意思是:onDestroy調用時和app退出時一樣)網友3:GC統一回收,要看GC判斷你這個對象是不是不可達了網友4:那只是個AMS流程回調
2、上述情況Activity有沒有被回收?
網友1 :Receiver一直持有Activity的引用怎麽被回收
網友2:activity也是GC負責回收的,如果被強引用,沒法回收
3、如果Activity被銷毀了,Receiver是否還有引用?網友1:Receiver明顯不止被Activity持有,Receiver會註冊到系統管理的的ams中網友2:如果receiver被static修飾,即使activity被銷毀,receiver也不會被回收,指向這個receiver的指針變成了野指針,沒法主動銷毀,從而造成內存泄露網友3:你在Activity中註冊了廣播,如果不取消註冊,這個廣播會一直存在在系統中,這個廣播會一直持有ACtivity的引用,肯定會內存泄漏。就跟非靜態內部類一樣
網友4: activity回收後receiver還在運行
來自為知筆記(Wiz)
1、onDestroy被回調代不代表Activity被回收了?官方是這麽說的
Perform any final cleanup 【before】 an activity is destroyed.
眾多網友:不代表!網友1:代表【將】被系統回收,具體什麽時候回收看系統
網友2:app退出時,並不清理其所占用的內存,你調gc只是建議,幹不幹還得看gc自己(意思是:onDestroy調用時和app退出時一樣)網友3:GC統一回收,要看GC判斷你這個對象是不是不可達了網友4:那只是個AMS流程回調
2、上述情況Activity有沒有被回收?
網友1
網友2:activity也是GC負責回收的,如果被強引用,沒法回收
3、如果Activity被銷毀了,Receiver是否還有引用?網友1:Receiver明顯不止被Activity持有,Receiver會註冊到系統管理的的ams中網友2:如果receiver被static修飾,即使activity被銷毀,receiver也不會被回收,指向這個receiver的指針變成了野指針,沒法主動銷毀,從而造成內存泄露網友3:你在Activity中註冊了廣播,如果不取消註冊,這個廣播會一直存在在系統中,這個廣播會一直持有ACtivity的引用,肯定會內存泄漏。就跟非靜態內部類一樣
網友4:
來自為知筆記(Wiz)
為什麽不取消註冊BroadcastReceiver會導致內存泄漏