安卓運(yùn)行時(shí)crash問題解決——java.lang.IllegalArgumentException: Receiver not registered:

今天在進(jìn)行自測(cè)的時(shí)候,偶然發(fā)現(xiàn)了一個(gè)crash。場(chǎng)景時(shí)在用戶第一次安裝登錄時(shí),點(diǎn)擊登錄出現(xiàn)閃退。

報(bào)錯(cuò)日志如下:

08-10 18:19:04.021 E/AndroidRuntime(24334): java.lang.RuntimeException: Unable to pause activity {*****(packageName)/*****(packageName).MainActivity}: java.lang.IllegalArgumentException: Receiver not registered: null

08-10 18:19:04.021 E/AndroidRuntime(24334):     at android.app.ActivityThread.performPauseActivity(ActivityThread.java:3736)

08-10 18:19:04.021 E/AndroidRuntime(24334):     at android.app.ActivityThread.performPauseActivity(ActivityThread.java:3695)

08-10 18:19:04.021 E/AndroidRuntime(24334):     at android.app.ActivityThread.handlePauseActivity(ActivityThread.java:3670)

08-10 18:19:04.021 E/AndroidRuntime(24334):     at android.app.ActivityThread.access$1100(ActivityThread.java:177)

08-10 18:19:04.021 E/AndroidRuntime(24334):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1459)

08-10 18:19:04.021 E/AndroidRuntime(24334):     at android.os.Handler.dispatchMessage(Handler.java:102)

08-10 18:19:04.021 E/AndroidRuntime(24334):     at android.os.Looper.loop(Looper.java:145)

08-10 18:19:04.021 E/AndroidRuntime(24334):     at android.app.ActivityThread.main(ActivityThread.java:5942)

08-10 18:19:04.021 E/AndroidRuntime(24334):     at java.lang.reflect.Method.invoke(Native Method)

08-10 18:19:04.021 E/AndroidRuntime(24334):     at java.lang.reflect.Method.invoke(Method.java:372)

08-10 18:19:04.021 E/AndroidRuntime(24334):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1399)

08-10 18:19:04.021 E/AndroidRuntime(24334):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1194)

08-10 18:19:04.021 E/AndroidRuntime(24334): Caused by: java.lang.IllegalArgumentException: Receiver not registered: null

08-10 18:19:04.021 E/AndroidRuntime(24334):     at android.app.LoadedApk.forgetReceiverDispatcher(LoadedApk.java:822)

08-10 18:19:04.021 E/AndroidRuntime(24334):     at android.app.ContextImpl.unregisterReceiver(ContextImpl.java:2038)

08-10 18:19:04.021 E/AndroidRuntime(24334):     at android.content.ContextWrapper.unregisterReceiver(ContextWrapper.java:528)

08-10 18:19:04.021 E/AndroidRuntime(24334):     at *****(packageName).MyFragment.onPause(MyFragment.java:185)

08-10 18:19:04.021 E/AndroidRuntime(24334):     at android.support.v4.app.Fragment.performPause(Fragment.java:1950)

08-10 18:19:04.021 E/AndroidRuntime(24334):     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1005)

08-10 18:19:04.021 E/AndroidRuntime(24334):     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1138)

08-10 18:19:04.021 E/AndroidRuntime(24334):     at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1120)

08-10 18:19:04.021 E/AndroidRuntime(24334):     at android.support.v4.app.FragmentManagerImpl.dispatchPause(FragmentManager.java:1943)

08-10 18:19:04.021 E/AndroidRuntime(24334):     at android.support.v4.app.FragmentActivity.onPause(FragmentActivity.java:393)

08-10 18:19:04.021 E/AndroidRuntime(24334):     at com.fiberhome.smarthome.BaseActivity.onPause(BaseActivity.java:63)

08-10 18:19:04.021 E/AndroidRuntime(24334):     at android.app.Activity.performPause(Activity.java:6447)

08-10 18:19:04.021 E/AndroidRuntime(24334):     at android.app.Instrumentation.callActivityOnPause(Instrumentation.java:1308)

08-10 18:19:04.021 E/AndroidRuntime(24334):     at android.app.ActivityThread.performPauseActivity(ActivityThread.java:3722)

08-10 18:19:04.021 E/AndroidRuntime(24334):     ... 11 more

崩潰的原因很簡單:在沒有調(diào)用過registerReceiver的情況下,程序調(diào)用unregisterReceiver進(jìn)行解綁操作。

剛接手的新項(xiàng)目,粗略一看onResume和onPause中分別調(diào)用registerReceiver和unregisterReceiver方法。那么為什么還是會(huì)出現(xiàn)這種錯(cuò)誤呢。

再仔細(xì)一看,onResume代碼中有一句判斷引起了我的注意。在token為空的情況下,函數(shù)已經(jīng)返回了,并未進(jìn)行registerReceiver的流程。具體改動(dòng)如下圖:

image.png

這也給我一個(gè)警示,在調(diào)用registerReceiver和unregisterReceiver時(shí),必須保持順序性??稍趏nCreate/onDestroy;onResume/onPause組合中調(diào)用。注意不要在onCreate中調(diào)用registerReceiver,而在onStop/onPause中調(diào)用unregisterReceiver,因?yàn)槎呗暶髦芷诓粚?duì)稱;可能出現(xiàn)調(diào)用unregisterReceiver比registerReceiver次數(shù)多的問題。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1、Androiddvm的進(jìn)程和Linux的進(jìn)程, 應(yīng)用程序的進(jìn)程是否為同一個(gè)概念 DVM指dalivk的虛擬機(jī)。...
    ifeng_max閱讀 1,013評(píng)論 0 10
  • 面試題總結(jié) 通用 安卓學(xué)習(xí)途徑, 尋找資料學(xué)習(xí)的博客網(wǎng)站 AndroidStudio使用, 插件使用 安卓和蘋果的...
    JingBeibei閱讀 1,864評(píng)論 2 21
  • 轉(zhuǎn)自Android四大基本組件介紹與生命周期Android四大基本組件分別是Activity,Service服務(wù),...
    開子的私家地閱讀 1,571評(píng)論 0 5
  • 轉(zhuǎn)自 1. 什么是Activity? 四大組件之一,一般的,一個(gè)用戶交互界面對(duì)應(yīng)一個(gè)activity setCon...
    joe1632閱讀 1,463評(píng)論 0 7
  • 90后這一代人大概在年少時(shí)都聽過許嵩的歌吧。他的歌大都朗朗上口,歌詞唯美憂郁,又貼近生活,聽他的歌總能想起自己的經(jīng)...
    Aeimqzxvt閱讀 1,442評(píng)論 0 8

友情鏈接更多精彩內(nèi)容