MainActivity中的onCreate两次或多次启动
问题
这两天安卓开发遇到一个问题,MainActivity中的onCreate多次执行,我的程序是一个开屏页,倒计时5秒后使用startActivity跳转到MainActivity中,我在开屏页的onCreate和MainActivity中的onCreate都增加了日志,却发现只有MainActivity中的onCreate被执行了2次,原因不明。
解决过程(踩坑过程)
在进行简单的打印日志后发现,只有MainActivity的onCreate被莫名其妙的多执行了一次,于是开始处理问题:
根据进程判断(无效)
这是我在百度上找到的,博主的标题为:onCreate被多次(调用)执行的解决方法 ,博主写的一大堆知识我就直接选择性忽略掉了,直接CV一下代码:
public void onCreate() {
String curProcessName = getProcessName(this, android.os.Process.myPid());
if (curProcessName != null && curProcessName.equalsIgnoreCase(this.getPackageName())) {
//初始化主线程资源
} else {
//初始化其它进程的资源
return;
}
}
public static String getProcessName(Context cxt, int pid) {
ActivityManager am = (ActivityManager) cxt.getSystemService(Context.ACTIVITY_SERVICE);
List<ActivityManager.RunningAppProcessInfo> runningApps = am.getRunningAppProcesses();
if (runningApps == null) {
return null;
}
for (ActivityManager.RunningAppProcessInfo procInfo : runningApps) {
if (procInfo.pid == pid) {
return procInfo.processName;
}
}
return null;
}
看代码就知道是在onCreate执行之后判断一下这个进程有没有执行,没有的话就执行,有的话直接return掉,满怀信心的一波复制之后,onCreate还是会执行两次甚至三次,再见!
参考地址:https://blog.csdn.net/chy555chy/article/details/51374603
死磕安卓四大启动模式(无效)
安卓四大启动模式:
- standard
- singleTop
- singleTask
- singleInstance
我已经在使用singleInstance单一实例了,但是想到可能是其它原因,于是我将standard标准启动模式、singleTop单一顶部模式、singleTask单一任务栈全部试了一遍,结果就是全军覆没。
给Intent添加flag(无效)
虽然很“坚定”问题不是出现在启动页上面看,可我的还是不由自主的给启动页的intent加上了一个flag:intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP) ,意思就是跳转的时候不会创建新的活动,当然This is useless;
恢复出厂设置(有效)
由于程序在大多数设备上并没有出现问题,于是推测是不是系统问题,恢复出厂设置的时候发现了设置内多了一个sim卡选项(重点),随后重置了一下系统,这时候发现4g卡不能用了,但是不再执行两次onCreate了,有效果,但是无法使用4g网了,这种方案不可以。其实这里有发现一个问题就是,如果设置内多了一个sim卡选项,那么就会执行两次或者多次onCreate,我对此有点奇怪,但是也一直记着这个事。
配置清单内的android:configChanges(有效)
其实我最开始就有测试过这个,当时考虑可能是屏幕旋转导致的,于是这样子写的:
android:configChanges="keyboardHidden|orientation"
不仅如此,网上很多人给出的解决方案也是这样写的,结果当然不行,但是工作还是要做的,于是继续搜索,突然看到这篇文章:Android APP设置为Launcher时被启动两次
,看到这是一篇原创文章,并且标题和我遇到的问题相匹配,所以即便第一眼看上去并没有我想要的答案后我还是向下翻滚了一下,发现了一张表格:
参数 | 中文意思 |
---|---|
density | 显示密度已更改-用户可能指定了不同的显示比例,或者现在可能正在激活其他显示。在API级别24中添加。 |
fontScale | 字体缩放比例已更改-用户选择了新的全局字体大小。 |
keyboard | 键盘类型已更改-例如,用户已插入外部键盘。 |
keyboardHidden | 键盘的可访问性已更改-例如,用户显示了硬件键盘。 |
layoutDirection | 布局方向已更改-例如,从左到右(LTR)更改为从右到左(RTL)。 |
locale | 语言环境已更改-用户选择了一种新的语言来显示文本。 |
mcc | IMSI移动国家/地区代码(MCC)已更改-已检测到SIM卡并更新了MCC。 |
mnc | IMSI移动网络代码(MNC)已更改-已检测到SIM卡并更新了MNC。 |
navigation | 导航类型(轨迹球/ dpad)已更改。(这通常不会发生。) |
orientation | 屏幕方向已更改-用户已旋转设备。 |
screenLayout | 屏幕布局已更改-现在可能正在激活其他显示。 |
screenSize | 当前的可用屏幕尺寸已更改。 |
smallestScreenSize | 触摸屏已更改。(这通常不会发生。) |
uiMode | 用户界面模式已更改-用户已将设备放置在桌子或汽车停放区中,或者夜间模式已更改。 |
就是 mcc 和 mnc以及上面提到的sim卡选项,让我感觉有搞头,于是你懂的,万事大吉。