开机时如果有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的人,如果对屏幕横竖切换不是很了解的话,经常会发现launcher的oncreate等一些生命周期的方法会被执行两次。这是因为android默认是坚屏的,如果运行在机顶盒上会切换到横屏来,导致生命周期的重新执行。
首先看下android:configChanges这个属性
“mcc“ 移动国家号码,由三位数字组成,每个国家都有自己独立的MCC,可以识别手机用户所属国家。
“mnc“ 移动网号,在一个国家或者地区中,用于区分手机用户的服务商。
“locale“ 所在地区发生变化。
“touchscreen“ 触摸屏已经改变。
“keyboard“ 键盘模式发生变化,例如:用户接入外部键盘输入。
“keyboardHidden“ 用户打开手机硬件键盘
“navigation“ 导航型发生了变化。
“orientation“ 设备旋转,横向显示和竖向显示模式切换。
“fontScale“ 全局字体大小缩放发生改变
另外有三点需要注意的:
1、不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次
2、设置Activity的android:configChanges="orientation"时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次
3、设置Activity的android:configChanges="orientation|keyboardHidden"时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法。但是,自从Android 3.2(API 13),在设置Activity的android:configChanges="orientation|keyboardHidden"后,还是一样会重新调用各个生命周期的。因为screen size也开始跟着设备的横竖切换而改变。所以,在AndroidManifest.xml里设置的MiniSdkVersion和 TargetSdkVersion属性大于等于13的情况下,如果你想阻止程序在运行时重新加载Activity,除了设置"orientation",你还必须设置"ScreenSize"。
"unspecified"
- 默认值. 由系统选择显示方向. 在不同的设备可能会有所不同.
"landscape"
- 橫向
"portrait"
- 纵向
"user"
- 用戶当前的首选方向
"behind"
- 与在活动堆栈下的活动相同方向
"sensor"
- 根据物理方向传感器确定方向. 取决于用戶手持的方向, 当用戶转动设备, 它跟隨改变.
"nosensor"
- 不经物理方向传感器確定方向. 该传感器被忽略, 所以当用戶转动设备, 显示不會跟隨改变. 除了这个区别,系統选择使用相同的政策取向对于“未指定”设置. 系統根据“未指定”("unspecified")设定选择相同显示方向.
因此解决launcher
增加属性:android:screenOrientation="landscape"
增加属性:android:configChanges="keyboard|keyboardHidden|orientation|touchscreen|uiMo
- 开机时如果有SIM卡,Launcher activity会启动两次
- Launcher Activity在开机时重启两次解决办法
- Android APP设置为Launcher时onCreate启动两次
- Android Launcher 会onCreate 两次的原因
- Android6.0开机时SIM卡开机初始化
- android 通过浏览器启动app,如果本地app先启动了,会出现启动两次的问题
- 多个launcher时开机只启动默认的
- Flask-为什么会启动两次
- 开机不启动 Launcher,启动其它应用
- android开机启动activity
- 开机即启动Activity
- Activity开机自启动
- Android开机自启动Launcher定制
- Android launcher 初体验--app开机启动
- android 开机启动桌面程序,launcher模式
- Android 启动Activity两个属性 .MAIN .LAUNCHER
- Android Launcher 启动 Activity 的工作过程
- TCP三次握手过程,如果两次握手会怎么样?
- XZ_iOS之CocoaPods的安装和使用最新
- AngularJS $resource
- java线程waiting与blocked的区别
- centos 7 yum源设置成阿里云
- 【LeetCode】532. K-diff Pairs in an Array
- 开机时如果有SIM卡,Launcher activity会启动两次
- Struts2 REST插件远程执行命令漏洞全面分析,WAF支持检测防御
- 自定义文件上传按钮样式
- SqlParameter防SQL注入的方法
- Java排查问题工具、命令总结
- GitChat · 软件工程 | 一小时教你学会 Maven 项目的构建与管理
- java模式之组合模式
- 解决Tomcat version 7.0 only supports J2EE 1.2, 1.3, 1.4, and Java EE 5 and 6 Web modules
- php银行卡验证