检测应用位于后台,并弹出手势解锁,解锁成功进入主界面

本文介绍如何在Android应用中实现手势解锁功能,当应用位于后台时,检测到用户重新打开应用,若已开启手势解锁,将弹出解锁界面。详细讨论了初期的思路误区和正确的解决方案,包括在BaseActivity中添加后台判断方法,以及在onStop和onResume中处理flag的状态来决定是否显示解锁界面。

功能描述:

1,开启了手势解锁,也就是打开了开关以后,第一次登陆进入会拦截下,判断有没有设置手势锁,有的话登录成功进入主界面前要弹出手势解锁界面,没有开启则直接进入主界面
2,在退出app,不是退出登录的情况下,也就是位于后台,再次进入如果开启了手势解锁要弹出解锁界面,没有则直接进入
3,不管是主界面还是其他,只要位于后台了,开启了手势解锁,再次进入弹出解锁,解锁成功进入主界面,也不管他之前停留的界面,只要解锁成功就是主界面

思路误区:

第一种想法是
在开关设置中,当开关打开则保存sp为true,否则为false,默认也为false,在BaseActivity的onResume或者onRestart方法中调用,根据sp的值进行判断,是否跳转到手势界面,最终失败,因为每个界面都会走这两个方法,导致跳转也会弹出手势界面,所以这个方法是不行的,第二种想法是创建一个service,在service里面获取当前应用的包名和手机栈顶应用包名,如果当前应用包名等于手机栈顶应用包名,说明用户打开了app,监听到用户打开了app,并且sp中的值为true,则弹出手势界面,在开关的打开关闭中开启和关闭服务,但是打开以后,每次进入在哪个方法中检查呢,试过了在application,但是application的oncreate是在创建时调用的,也不行,询问朋友,最终在朋友的帮助下得到解决,也是在BaseActivity里面操作,添加判断是否位于后台的方法。位于后台,且sp中的值为true,则弹出手势解锁,添加一个flag在默认flag为false,onStop中如果位于后台设置为true,判断flag是否为true,如果为true再判断sp中的值是否为true,如果两者都满足,则跳转到手势界面,当然在flag为true的代码块中,要把flag赋值为false,具体看代码

判断是否位于后台的方法

 //判断App是否在后台运行
    public static boolean isBackground(Context context) {
        ActivityManager activityManager = (ActivityManager) context
                .getSystemService(Context.ACTIVITY_SERVICE);
        List<ActivityManager.RunningAppProcessInfo> appProcesses = activityManager
                .getRunningAppProcesses();
        for (ActivityManager.RunningAppProcessInfo appProcess : appProcesses) {
            if (appProcess.processName.equals(context.getPackageName())) {
                /*
                BACKGROUND=400 EMPTY=500 FOREGROUND=100
                GONE=1000 PERCEPTIBLE=130 SERVICE=300 ISIBLE=200
                 */
                Log.i(context.getPackageName(), "此appimportace ="
                        + appProcess.importance
                        + ",context.getClass().getName()="
                        + context.getClass().getName());
                if (appProcess.importance != ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {
                    Log.i(context.getPackageName(), "处于后台"
                            + appProcess.processName);
                    return true;
                } else {
                    Log.i(context.getPackageName(), "处于前台"
                            + appProcess.processName);
                    return false;
                }
            }
        }
        return false;
    }

flag初始为false

 //标记APP是否从后台再次进入的flag
    private boolean flag = false;

在stop方法中判断是否位于后台,如果是,则设置为true

@Override
    protected void onStop() {
        super.onStop();
        boolean background = isBackground(BaseActivity.this);
        Log.d("BaseActivity", "===onStop");
        Log.d("BaseActivity", "background:" + background);
        if (background) {
            flag = true;
        }
    }

在onresume中再次判断

@Override
    protected void onResume() {
        super.onResume();
        boolean background = isBackground(BaseActivity.this);
        Log.d("BaseActivity", "===onResume");
        Log.d("BaseActivity", "background:" + background);
        if (flag) {
            flag = false;
            Boolean isGesture = SpUtils.getBoolean(BaseActivity.this, "isGesture");
            Log.d("BaseActivity", "isGesture:" + isGesture);
            if (isGesture){
                Log.e("BaseActivity", "打开解锁界面");
                Intent intent = new Intent(BaseActivity.this, GestureActivty.class);
                startActivity(intent);
            }

        }
    }

demo:demo

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值