今天在進(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ù)多的問題。