#app切换到后台一分钟后锁定,需要输入手势密码才能打开(程序锁)
解锁规则:
- 未设置解锁密码,则什么都不用输入即可进入应用
- 1分钟内再次回到应用,无需输入密码、手势密码等即可进入
- 超过1分钟后回到应用,需输入手势密码即可进入
涉及到的点:
- 手势密码
- 如何判断app切换到后台和切换到前台
- 时间点的把控
- 通过广播通知打开手势密码解锁界面
逐一突破:
-
手势密码用了开源的项目
- https://github.com/sym900728/LockPattern
-
判断app是否切换到后台和前台
//应用前后台切换的判断
registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
@Override
public void onActivityStopped(Activity activity) {
Log.v("viclee", activity + "onActivityStopped");
count--;
if (count == 0) {
timeStart = new Date().getTime();
Logger.d("切到后台-->"+timeStart);
}
}
@Override
public void onActivityStarted(Activity activity) {
Log.v("viclee", activity + "onActivityStarted");
if (count == 0) {
Logger.d("切到前台");
long timeEnd = new Date().getTime();
Logger.d("时间差"+(timeEnd-timeStart));
//切换到前台和切换到后台的时间差大于等于10s
if(!isLock&&BaseApplication.isPassportLogin&&timeStart!=0&&timeEnd-timeStart>=1000*60){
isLock = true;//app被锁
Intent receiver = new Intent();
receiver.setAction("GO_LOGIN");
sendBroadcast(receiver);
}
}
count++;
}
@Override
public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
// Logger.d("onActivitySaveInstanceState");
}
@Override
public void onActivityResumed(Activity activity) {
// Logger.d("onActivityResumed");
}
@Override
public void onActivityPaused(Activity activity) {
// Logger.d("onActivityPaused");
}
@Override
public void onActivityDestroyed(Activity activity) {
// Logger.d("onActivityDestroyed");
}
@Override
public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
// Logger.d("onActivityCreated");
}
});
- 时间点的把控
- 淘汰的想法:我开始想的是用服务,当app被切换到后台时候,开启服务计时,实现完毕后,觉得考虑到性能还有耗电量的问题,就放弃了
- 每当app切换到后台时候记录一个时间,当切换到前台时候,把当前时间和切换到后台时候记录的时间比较,这样来判断,具体参考上面代码中的
- 通过广播通知打开手势密码解锁界面
public class ForegroundTaskReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
//切换到前台了
if(intent.getAction().equals("GO_LOGIN")){
watchStack();
}
}
/**
* 监控任务栈
*/
public void watchStack() {
byte[] getsurePassword = ACache.getInstance(BaseApplication.getContext()).getAsBinary(SPUtils.getString(BaseApplication.getContext(), "phone", ""));
//有手势密码 && 超过1分钟
if (getsurePassword != null && getsurePassword.length > 0) {
Intent intent = new Intent(BaseApplication.getContext(), LockHandPasswordLoginActivity.class);
// 服务或广播中打开Activity,需要设置此参数
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
BaseApplication.getContext().startActivity(intent);
Logger.d("打开手势密码解锁接界面");
}
}
}
##demo下载地址
demo下载地址