Android Activity重启分析:
描述:
最近在做项目时,碰到一个诡异的问题,各种可能的导致的原因排查了一天的时间,最后才解决。为什么说诡异,是因为正常情况下是不会出现该问题的,而且百度上还真找不到相关的资料。
问题表现:一个普通的Activity 在经历正常生命周期即:onCreate()–>onStart()–>onResume()后,由于点击了界面上的某个按钮,执行了一些逻辑(暂时不说该逻辑干了什么事),结果由界面现象引起我去查看Log日志,发现该Activity竟然自动执行了onPause()->onStop()–>onDestroy(); 再onCreate()—>onStart()–>onResume(); 次奥!自动重启了!?
真相大白:
既然已经想到是由于configChanges导致的Activity重绘,那么就往这方面去想还有什么会导致configChanges,于是这次机灵一点,再次从整个手机系统的Log入手,输入关键字“change”,在过滤同的Log日志中仔细找找有什么change了,(其实这里笨了,因为既然知道了写上android:configChanges属性就不会导致Activity重绘,那么直接去那里查属性值就好了),结果在日志中查看到“SimStatusChangeReceiver”,好吧,大概意思就是说Sim卡状态变化了,在此就解释在操作那个按钮干了什么事,因为项目比较特殊能改变Sim卡的禁用与启用状态,然后再在android:configChanges=”xx|xx”,属性值里查看,还真有“mcc“、”mnc”两值,把这个写上吧,即
android:screenOrientation=”portrait”
android:configChanges=”mcc|mnc” (意思即为匹配Sim卡中的状态变化),最后问题解决。
添加onConfigurationChanged,没被调用:添加
android:configChanges="orientation|keyboard|keyboardHidden|mcc|mnc|screenSize"
必须添加screenSize和orientation。
添加权限:
<uses-permission android:name="android.permission.CHANGE_CONFIGURATION"/>
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
Log.e(TAG, "onConfigurationChanged....");
}