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

2019-07-14 02:12发布

一、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 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代码非完整版!非完整版!非完整版