开机时如果有SIM卡,Launcher activity会启动两次

来源:互联网 发布:oracle数据库自学视频 编辑:程序博客网 时间:2024/06/05 06:05

做一个项目,到了后期需要用到sim卡的时候发现原来的一些功能用不了了,通过查log发现,是加入sim卡后,开机时在sim卡在公网注册成功的时候APP重启了一次,而且是不完全重启,也就是有一些判断if(** ==null)才会去做的事情并不会去做。困扰许久,直到找到了下面的内容。




今天在看log的时候发现,Launcher activity会被onDestroy掉一次,然后再重启。
可能原因猜测:
1.横竖屏切换
2.MCC MNC等Configuration改变引起的 MCC(移动国家码)和 MNC(移动网络码)
由于当时的Launcher设置为强制横屏了,应该是不会引起重启的。
对于Configuration改变系统会发一个android.intent.action.CONFIGURATION_CHANGED的广播
于是就做了一个广播接收器去检测是不是由于Configuration改变引起的(后来发现Launcher本身有监听这个广播)
果然发现MCC值由0(未定义)变为460(中国)
原因已经初步确定了,怎么才能让activity不重启呢?
既然是activity重启,那就先去看一下activity有什么属性可以防止重启....
运气实在是好,刚好有这么个属性:
android:configChanges=["mcc", "mnc", "locale", "touchscreen", "keyboard", "keyboardHidden", "navigation", "screenLayout", "fontScale", "uiMode", "orientation", "screenSize", "smallestScreenSize"]
官方的解释是这样的:
Lists configuration changes that the activity will handle itself. When a configuration change occurs at runtime, the activity is shut down and restarted by default, but declaring a configuration with this attribute will prevent the activity from being restarted. Instead, the activity remains running and itsonConfigurationChanged() method is called.
大致意思也就是说:
 
  那些被列举的属性configuration改变时activity是否保存自己的状态。当应用发生了configuration改变,默认情况下activity将关闭并重启自身,但是如果定义了这个属性,activity将不必重启,它将保持运行状态同时调用onConfigurationChanged()方法。也就是说当不配置android:configChanges="mcc|mnc"时,当mcc或mnc的值发生改变的时候,会重启activity,并且onConfigurationChanged()不会被调用
果然配置了这个属性后Launcher Activity就不会在开机时候启动两次了。


来个彻底的:

android:configChanges="keyboardHidden|orientation|screenSize|locale|screenLayout|mcc|mnc"






补充:来自http://blog.sina.com.cn/s/blog_740ccd040102v1ul.html


刚接触launcher的人,如果对屏幕横竖切换不是很了解的话,经常会发现launcheroncreate等一些生命周期的方法会被执行两次。这是因为android默认是坚屏的,如果运行在机顶盒上会切换到横屏来,导致生命周期的重新执行。

 

首先看下android:configChanges这个属性

 

mcc“ 移动国家号码,由三位数字组成,每个国家都有自己独立的MCC,可以识别手机用户所属国家。

mnc“ 移动网号,在一个国家或者地区中,用于区分手机用户的服务商。

locale“ 所在地区发生变化。

touchscreen“ 触摸屏已经改变。

keyboard“ 键盘模式发生变化,例如:用户接入外部键盘输入。

keyboardHidden“ 用户打开手机硬件键盘

navigation“ 导航型发生了变化。

orientation“ 设备旋转,横向显示和竖向显示模式切换。

fontScale“ 全局字体大小缩放发生改变

 

 "uiMode", 用户的模式发生了变化.

 

 

 

另外有三点需要注意的:

 

1、不设置Activityandroid:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次

 

2、设置Activityandroid:configChanges="orientation"时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次

 

3、设置Activityandroid:configChanges="orientation|keyboardHidden"时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法。但是,自从Android 3.2API 13),在设置Activityandroid:configChanges="orientation|keyboardHidden"后,还是一样会重新调用各个生命周期的。因为screen size也开始跟着设备的横竖切换而改变。所以,在AndroidManifest.xml里设置的MiniSdkVersion和 TargetSdkVersion属性大于等于13的情况下,如果你想阻止程序在运行时重新加载Activity,除了设置"orientation",你还必须设置"ScreenSize"

 

 再来看看android:screenOrientation属性

 

"unspecified"

- 默认值. 由系统选择显示方向. 在不同的设备可能会有所不同.

 

"landscape"

- 橫向

 

"portrait"

- 纵向

 

"user"

- 用戶当前的首选方向

 

"behind"

- 与在活动堆栈下的活动相同方向

 

"sensor"

- 根据物理方向传感器确定方向. 取决于用戶手持的方向, 当用戶转动设备, 它跟隨改变.

 

"nosensor"

- 不经物理方向传感器確定方向. 该传感器被忽略, 所以当用戶转动设备, 显示不會跟隨改变. 除了这个区别,系統选择使用相同的政策取向对于“未指定”设置. 系統根据“未指定”("unspecified")设定选择相同显示方向.

 

因此解决launcher  oncreate方法执行两次的问题的方法是:

 

增加属性:android:screenOrientation="landscape"

 

增加属性:android:configChanges="keyboard|keyboardHidden|orientation|touchscreen|uiMo





原创粉丝点击