app切换到后台一分钟后锁定,需要输入手势密码才能打开(程序锁)

app切换到后台一分钟后锁定,需要输入手势密码才能打开(程序锁)

解锁规则:

  1. 未设置解锁密码,则什么都不用输入即可进入应用
  2. 分钟内再次回到应用,无需输入密码、手势密码等即可进入
  3. 超过1分钟后回到应用,需输入手势密码即可进入

涉及到的点:

  1. 手势密码
  2. 如何判断app切换到后台和切换到前台
  3. 时间点的把控
  4. 通过广播通知打开手势密码解锁界面

逐一突破:

  1. 手势密码用了开源的项目

    • https://github.com/sym900728/LockPattern
  2. 判断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");
            }
        });
  1. 时间点的把控
    1. 淘汰的想法:我开始想的是用服务,当app被切换到后台时候,开启服务计时,实现完毕后,觉得考虑到性能还有耗电量的问题,就放弃了
    2. 每当app切换到后台时候记录一个时间,当切换到前台时候,把当前时间和切换到后台时候记录的时间比较,这样来判断,具体参考上面代码中的
  2. 通过广播通知打开手势密码解锁界面
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下载地址

你可能感兴趣的:(android)