Android 手势锁判断程序是否是电源键锁屏或者是否从后台唤醒

一、BB叨:

最近公司的App要加入一个功能,手势解锁!(╯#-_-)╯~~~~~~~~~~~~~~~~~╧═╧ 大力掀

功能描述:需要在App 进入后台,或者电源键锁屏后,再次唤醒或者启动App的时候验证手势。ヘ( ̄ω ̄ヘ)

效果图:


二、思路:

判断App是否是从后台唤醒的,其实有个简单的方法来实现,判断App当前的可视状态。

三、具体实现:

    1. 你需要一个BaseActivity来管理你所有需要手势验证的Activity;(如果你想问什么是BaseActivity 请自行百度Σ( ° △ °|||)︴)。

    2.让需要弹出手势验证的Activity都继承BaseActivity。

    3.创建一个单例,里面包含是否是从后台唤醒的flag:(ps:这么说不严谨可以理解为app变为可触发焦点的状态并且位于屏幕最上方,以下都称之为“后台唤醒”)。

    

public class GestureData {
    /**
     * 是否是从后台唤醒的true ,false 不是
     */
    private boolean isAwaken = false;

    public static GestureData sIntance = new GestureData();

    /**
     * 构造方法私有化
     */
    private GestureData() {

    }

    public static GestureData getIntance() {
        return sIntance;
    }

    public boolean isAwaken() {
        return isAwaken;
    }

    public void setAwaken(boolean awaken) {
        isAwaken = awaken;
    }

}

    4.偏好设置用于存放手势密码是否设置的flag,以及手势密码:

package com.my.gesturemanager.util;

import android.content.Context;
import android.content.SharedPreferences;

/**
 * 项目名称:偏好设置
 * 创建人:MWB
 * 类描述:文件存储工具
 * 创建时间:2018/4/4 16:00
 */

public class SharedPrefUtil {
    private SharedPreferences.Editor mEditor;
    private SharedPreferences mSharedPreferences;

    public SharedPrefUtil(Context context, String name) {
        mSharedPreferences = context.getSharedPreferences(name, Context.MODE_PRIVATE);
        mEditor = mSharedPreferences.edit();
    }

    public void putString(String key, String value) {
        mEditor.putString(key, value);
    }

    public void putInt(String key, int value) {
        mEditor.putInt(key, value);
    }

    public void putLong(String key, long value) {
        mEditor.putLong(key, value);
    }

    public void putBoolean(String key, boolean value) {
        mEditor.putBoolean(key, value);
    }

    public int getInt(String key, int defaultValue) {
        return mSharedPreferences.getInt(key, defaultValue);
    }

    public boolean getBoolean(String key, boolean defaultValue) {
        return mSharedPreferences.getBoolean(key, defaultValue);
    }

    public long getLong(String key, long defaultValue) {
        return mSharedPreferences.getLong(key, defaultValue);
    }

    public String getString(String key, String defaultValue) {
        return mSharedPreferences.getString(key, defaultValue);
    }

    public void commit() {
        mEditor.commit();
    }

    public void delete(String key) {
        mEditor.remove(key);
    }

    public void clear() {
        mEditor.clear();
        mEditor.commit();
    }
}

    4.在BaseActivity里的onResume方法当中判断App是否从后台唤醒的(可以触发焦点的状态)再判断是否有手势密码。

@Override
protected void onResume() {
    super.onResume();

    // 判断程序是为后台唤醒的
    if (!GestureData.getIntance().isAwaken()) {
        // 设置唤醒状态为true
        GestureData.getIntance().setAwaken(true);
        toastUtil("App是从后台唤醒的");
        // 判断是否设置着手势密码
        if (sp.getBoolean("GesuterSetting", false)) { // 设置了手势密码
            toastUtil("设置了手势密码");
        } else {
            toastUtil("没有设置手势密码");
        }
    }
}

5.在BaseActivity里的onStop()方法当中判断App现在的状态,有人会问:为什么是在onStop方法中,而不是在onDestroy方法当中呢?请自行查阅App的生命周期。我们继续,遍历手机中所有正在进行的进程信息,找到我们App的进程,根据进程的状态来判断当前App的运行状态。

@Override
protected void onStop() {
    super.onStop();
    if (!isAppOnForeground()) {
        // 单例中是否退到过后台设置为 false
        GestureData.getIntance().setAwaken(false);
    }
}

/**
 * App 是否从后台唤醒的
 *
 * @return boolean
 */
private boolean isAppOnForeground() {
    // Activity 管理器 (管理应用程序的系统状态)
    ActivityManager am = (ActivityManager) this.getSystemService(Context.ACTIVITY_SERVICE);
    // 当前的包名
    String curPackageName = getApplicationContext().getPackageName();
    // 运行应用程序进程信息 = 获取正在运行的应用进程
    List<ActivityManager.RunningAppProcessInfo> app = am.getRunningAppProcesses();
    if (app == null) {
        return false;
    }

    // 遍历正在运行的进程信息
    for (ActivityManager.RunningAppProcessInfo a : app) {

        // 如果进程的包名一致 并且 进程的重要性 是IMPORTANCE_FOREGROUND(100在屏幕最前端、可获取到焦点 )
        if (a.processName.equals(curPackageName) &&
                a.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {
            return true;
        }
    }

    return false;
}

到此为止就可以判断app是否是从后台唤醒的了,效果如下:


    啊~马上清明节假期了不写了,如果假期有时间我会接着补坑的,放心不会弃更的~虽然也不会有人看ಥ_ಥ

本Demo代码非完整版!非完整版!非完整版



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值