[mobilesafe] 02_程序锁中输入密码EnterPasswordActivity的bug和长按HOME键最近Activity列表

Android 4.0

程序锁中输入密码EnterPasswordActivity的bug和长按HOME键最近Activity列表

bug1: EnterPasswordActivity的启动模式bug 
bug如图片描述

分析:
1、首先打开手机卫士,系统分配一个Task给手机卫士,该Task只有Home一个Activity,
2、然后按HOME物理按键,此时回到桌面,由于都没有配置Activity启动模式,所以系统也会给桌面分配一个新的Task,并放在手机卫士Task前面
3、此时,打开有保护的浏览器应用,这时,看门狗,检测到,跳出输入密码的EnterPasswordActivity,
由于是指定的intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);即如果有Task,那么就用以前的Task,如果没有就新创建一个Task,而之前有一个Task了,栈底有一个HomeActivity,而此时输入正确的密码后,却跳到了HomeActivity界面上去了
4、这是因为,新开的
EnterPasswordActivity复用了以前的手机卫士的Task,而该Task有一个HomeActivity,此时又会在栈顶将EnterPasswordActivity放置在栈顶上面。密码输入成功后,EnterPasswordActivity就finish()掉了,此时就进入了HomeActivity界面了

解决:
EnterPasswordActivity的启动模式设置为singleInstance,
每个
EnterPasswordActivity都会开启一个新的Task,就可以解决前面的bug了
<activity
    android:name="cn.zengfansheng.mobilesafe.EnterPasswordActivity"
    android:launchMode="singleInstance" >
</activity>

注意1
:长按物理HOME键,是列举出来最近开启的Activity
注意2
:每一个应用一般有一个Task,如果某一个Activity配置singleInstance启动模式,那就会有个多个Task
bug2:长按HOME键,列举最近的Activity
如果刚好,打开一个要保护的应用,输入完密码后,进入后,
此时长按HOME键,此时列举的是手机卫士的名字和图标,
但点击进去,却是EnterPasswordActivity,这个用户并不好。
解决:不在最近Activity展示,在Activity中配置 android:excludeFromRecents="true"   ,不在最近列表中展示。
<activity
    android:name="cn.zengfansheng.mobilesafe.EnterPasswordActivity"
    android:excludeFromRecents="true"
    android:launchMode="singleInstance" >
</activity>

注意:在Android2.x低版本的模拟器上,长按HOME键列举的最近的Activity是不能被移除的,而高版本的Android4.x后,
在最近的列表中,可以被移除。
a)配置
android:excludeFromRecents="true"  
b)将列举的Activity向左拖动,就可以将其移走