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它时抓狂的过程以及解决了它后,志之以共勉。



如何在 Android 程序中禁止屏幕旋转和重启Activity

禁止屏幕随手机旋转变化

有时候我们希望让一个程序的界面始终保持在一个方向,不随手机方向旋转而变化:
在AndroidManifest.xml的每一个需要禁止转向的Activity配置中加入android:screenOrientation=”landscape” 属性。

landscape = 横向
portrait = 纵向

 

避免在转屏时重启Activity

android中每次屏幕方向切换时都会重启Activity,所以应该在Activity销毁前保存当前活动的状态,在Activity再次 Create的时候载入配置,那样,进行中的游戏就不会自动重启了!
要避免在转屏时重启Activity,可以通过在AndroidManifest.xml文件中重新定义方向(给每个Activity加上 android:configChanges=”keyboardHidden|orientation”属性)。
在需要控制屏幕显示方向的Activity中重写 onConfigurationChanged(Configuration newConfig)方法,这样在转屏时就不会重启Activity了。

复制代码
if(newConfig.orientation==Configuration.ORIENTATION_LANDSCAPE) {
    //横向
    setContentView(R.layout.file_list_landscape);
} else {
    //竖向
    setContentView(R.layout.file_list);
}
复制代码

 

复制代码
<activity android:name="com.myapp.MyActivity"
          android:label="@string/app_name"
          android:screenOrientation="landscape"
          android:configChanges="orientation"
          >
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>
复制代码

android:screenOrientation=”landscape”
android:configChanges=”keyboardHidden|orientation”

 

复制代码
@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
 
    if(newConfig.orientation==Configuration.ORIENTATION_LANDSCAPE) {
        //横向
        setContentView(R.layout.file_list_landscape);
    } else {
        //竖向
        setContentView(R.layout.file_list);
    }
}
复制代码

在模拟器中可以按 CTL+F11 模拟做屏幕旋转。

 

参考:

How to disable Screen Auto-Rotation on Android
http://digitaldumptruck.jotabout.com/?p=897

 

如何在 Android 程序中禁止屏幕旋转和重启Activity
http://www.androidcn.com/news/20110302/00001299.html



  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值