解锁规则:
未设置解锁密码,则什么都不用输入即可进入应用分钟内再次回到应用,无需输入密码、手势密码等即可进入超过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下载地址