Android Activity自动重启的问题

描述: 最近在做项目时,碰到一个诡异的问题,各种可能的导致的原因排查了一天的时间,最后才解决。为什么说诡异,是因为正常情况下是不会出现该问题的,而且百度上还真找不到相关的资料。
问题表现:一个普通的Activity 在经历正常生命周期即:onCreate()–> onStart()–>onResume()后,由于点击了界面上的某个按钮,执行了一些逻辑(暂时不说该逻辑干了什么事),结果由界面现象引起我去查看Log日志,发现该Activity竟然自动执行了onPause()–>onStop()–>onDestroy(); 再onCreate()—>onStart()–>onResume(); 次奥!自动重启了!?
处理:
1、于是第一反应就是是不是程序有什么异常(空指针什么的)导致,查看日志发现,任何Error级别的日志毛都没有;
2、由于该Activity启动时会绑定一个远程Service,使用AIDL进行通讯,于是想是不是由于那个远程Service崩溃导致的,再追踪那个远程Service的进程,却也没有发现任何异常的日志;
3、继续追踪(有难度的bug,一方面能激起程序员的斗志,当然也能让程序员感觉无望崩溃),这次按照操作流程的代码上下流程一步一步Debug,然而当你仔细推敲自己代码逻辑确实没有问题但就是有这样的现象的时候,慢慢就进入抓狂崩溃节奏的节奏。
4、于是突然想到Android系统在一个程序有fatal类型的bug时会强制直接结束掉程序,于是又在一大堆Log日志里搜索fatal/force close之类的关键字,又在ActivityManager 这个tag下看有没有结束Activity的信息,以这些手段看能不能查出什么端倪,仍然无果;
5、脑海里突然闪现过一个想法,就是一个Activity在什么情况下会使生命周期重走一遍呢?由于早前研究Activity生命周期时碰过类似情形,答案即为当用户按下电源、或者横竖屏切换等条件下,如果当前Activity在AndroidManifest项目清单没有写上android:configChanges=”“属性时,会使得当前Activity重绘,即先Destroy掉然后重启,心中暗喜,但是不是这样引起的呢?且等,我的那个Activity虽然没有写android:configChanges属性,但是我并没有按电源键,更没有横竖屏幕切换(因为我定了屏幕方向为android:screenOrientation=”portrait”),也没有软键盘的隐藏与展示,那么究竟是什么鬼导致的configChanges呢??抓狂!!
真相大白:
既然已经想到是由于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卡中的状态变化),最后问题解决。

**总结:**1、碰到该问题时没有第一时间想到Activity自动重启是由于configChange引起的;
2、以前并不知道原来Sim卡的状态变化也是configChanges的一种,且会让没有写configChanges属性的Activity重启,Sim变化的触发情况倒是有:1)、手机中的Sim卡在某种情况下突然失效;2)、用户热拨插Sim卡(一些手机的Sim卡槽在手机右侧抽屉式);3、软件行为等。
3、就算Activity重启,也需要作好一些状态的保存,然后在onCreate()生命周期方法中再提取出来
另configChanges=”“还有一些其他值选项,大家可以去参考研究一下。

最后:调试一个bug,写了那么多废话,让各位眼睛受累了,在此笔者只是记录一下这个比较诡异bug让我在debug它时抓狂的过程以及解决了它后,志之以共勉。

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值