android 老款手机有三个物理键,新款的部分手机都把物理键给隐藏了,直接用虚拟键代替,但这三个键的功能是一样的,分别是 back 返回键、 Home 主界面键、Menu 菜单键。点击菜单键时,页面会出现app的列表预览图,通常情况下,每个app有一个预览图,如果我们想让一个app显示两个或多个预览图,该怎么办?
比如说我们的App中有两个页面 Activity1 和 Activity2,打开顺序是从 1 跳转到 2,我们想让这两个页面都显示在任务列表预览视图中,通常的做法是通过 Intent 来设置属性,比如在 Activity1 中执行跳转的方法
public void startActivity(){
Intent intent = new Intent(this, Activity2.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_DOCUMENT);
intent.addFlags(Intent.FLAG_ACTIVITY_MULTIPLE_TASK);
startActivity(intent);
}
由于 FLAG_ACTIVITY_NEW_DOCUMENT 这个字段是系统21之后才添加的,之前使用的是 FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET,它存在于 3-20,因此上面方法可以稍微优化下
public void startActivity(){
Intent intent = new Intent(this, Activity2.class);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_DOCUMENT);
} else {
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
}
intent.addFlags(Intent.FLAG_ACTIVITY_MULTIPLE_TASK);
startActivity(intent);
}
在 Activity2 中的返回键或关闭页面时,需要主动调用 finishAndRemoveTask() 方法,结束并移除任务列表
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if(keyCode == 4){
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
finishAndRemoveTask();
return false;
}
}
return super.onKeyDown(keyCode, event);
}
以上是第一种写法。还有一种方法,则是通过配置清单中,通过 taskAffinity 和Activity的启动模式来实现相同的效果,以上述为例,
<activity android:name=".Activity2"
android:launchMode="singleInstance"
android:taskAffinity="com.test.cn"
>
其实只通过 taskAffinity 来控制即可,但为了防止 Activity2 多次创建,并且可以把它放到一个单独的堆栈中,所以使用了 singleInstance 启动模式。
多栏位的视图,如果想修改应用名称和图标,可以在配置清单中修改 label 和 icon 属性
<activity android:name=".Activity2"
android:label="test"
android:icon="@drawable/mine_grade_lable"
android:launchMode="singleInstance"
android:taskAffinity="com.test.cn"
>
这样就可以了。