遇到问题,部分手机安卓部分手机后台打开开屏页,然后再跳到之前页面。
1.出现原因
应用A 通过包名启动应用B,此时的intent是启动意图,
应用B B_1页面启动后,启动主页B_2,同时关闭B_1,返回多级调整【B_2_B_3…>Bn】
返回桌面,点击图标启动B,此时的intent是启动意图复用创建时的intent,重新启动B,【B_2_B_3…>B_1】,因为B_2的启动模式singleTask,栈内唯一,B_2重用,并移除栈上的B_n等页面,造成上层的页面关闭,而B_2仍然正常,即回到应用主页
2.修复方式
启动B_1页面时,判断其栈内是否有其他页面使用,使用isTaskRoot()判断是否是栈底的页面,仅且正常开启才会在栈底,而当从其他app跳转时,如果栈内已有活动页面,不做处理即可。
而从柯元旦所著的《android内核剖析》一书中有记录如下规则:
每次启动Intent导致新创建Task的时候,该Task会记录导致其创建的Intent;而如果后续需要有一个新的与创建Intent完全一致(完全一致定位为:启动类,action、category等等全部一样,不可多项也不可缺少),那么该Intent并不会触发Activity的新建启动,而只会将已经存在的对应Task移到前台;这也就是为什么桌面会在再次点击图标时将后台任务挪到前台而不是重新启动App的实现
3.实际上现在有些手机只要退到后台,再回来就依然复现
if (!isTaskRoot()) {//// 判断当前activity是不是所在任务栈的根
Intent intent = getIntent();
if (intent != null) {
String action = intent.getAction();
if (intent.hasCategory(Intent.CATEGORY_LAUNCHER) && Intent.ACTION_MAIN.equals(action)) {
finish();
}
}
}