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