在工作中遇到一个反馈的问题,就是如标题所言,更新或者新安装了app后,发现点击home键,再打开的时候,重新启动了。记录一下该问题的原因和解决办法。
问题出现的操作
- 安装APP成功后,在安装器中点击“打开”,APP启动,先进入闪屏页,然后才进入首页;
- 按下Home键,回到桌面;
- 再点击APP的图标,APP并不是打开之前已经加载完的首页,而是重新进入闪屏页,然后再进入首页
这样操作,就会出现这个问题。正常的点击桌面图标打开,home键回到桌面,再点击app图标,是不会出现这个问题的,包括直接run到测试机上,也不会出现。
出现问题的原因
网上查找了资料,原因是
安装器启动app和点击图标启动APP是有区别的。
从安装界面启动activity和桌面点击图标启动activity时所使用的Intent是不一样的。从安装界面启动activity是会调用setpackage方法,从桌面启动不会。
安装器打开APP的代码:
@Override
public Intent getLaunchIntentForPackage(String packageName) {
// First see if the package has an INFO activity; the existence of
// such an activity is implied to be the desired front-door for the
// overall package (such as if it has multiple launcher entries).
Intent intentToResolve = new Intent(Intent.ACTION_MAIN);
intentToResolve.addCategory(Intent.CATEGORY_INFO);
intentToResolve.setPackage(packageName);
List<ResolveInfo> ris = queryIntentActivities(intentToResolve, 0);
// Otherwise, try to find a main launcher activity.
if (ris == null || ris.size() <= 0) {
// reuse the intent instance
intentToResolve.removeCategory(Intent.CATEGORY_INFO);
intentToResolve.addCategory(Intent.CATEGORY_LAUNCHER);
intentToResolve.setPackage(packageName);
ris = queryIntentActivities(intentToResolve, 0);
}
if (ris == null || ris.size() <= 0) {
return null;
}
Intent intent = new Intent(intentToResolve);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setClassName(ris.get(0).activityInfo.packageName,
ris.get(0).activityInfo.name);
return intent;
}
桌面打开APP代码:
public static Intent makeLaunchIntent(LauncherActivityInfo info) {
return new Intent(Intent.ACTION_MAIN)
.addCategory(Intent.CATEGORY_LAUNCHER)
.setComponent(info.getComponentName())
.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
}
参考1
Android Bug分析系列:第三方平台安装app启动后,home键回到桌面后点击app启动时会再次启动入口类bug的原因剖析 - 码农叔叔 - 博客园
参考2
Android开发之安装器中打开APP,Home键进入后台重新返回前台时会重新启动的Bug_码砖咋说的博客-CSDN博客
解决办法:
在启动页onCreate里添加下面代码。
if ((getIntent().getFlags() & Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT) != 0) { finish(); return; }
同时,在注册文件中,启动页的launchMode要去掉。否则不起作用。
网上也有别的解决办法,但是我测试过后,这个办法是比较好用的。