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

本文介绍了一个App手势解锁功能的实现方案,包括通过判断应用是否从后台唤醒并进行手势验证的逻辑,以及使用单例和偏好设置来管理手势密码的状态。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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



卡尔曼滤波与组合导航原理是一介绍了基于卡尔曼滤波算法的组合导航系统原理的论文。组合导航是一种利用多种传感器信息对航行器位置和姿态进行精确估算的技术。卡尔曼滤波是一种基于统计学原理的滤波算法,可以对信号进行滤波和估算,其本质是一种时序贝叶斯推断方法。 在组合导航系统中,多种传感器信息可以包括GPS、IMU、罗盘等。该论文主要介绍了如何利用卡尔曼滤波算法对组合导航系统进行优化。通过建立状态方程和观测方程,可以将传感器数据进行融合,并估算出航行器的位置和姿态信息。其中状态方程描述了航行器的运动模型,观测方程描述了各个传感器之间的关系。 论文中详细介绍了卡尔曼滤波算法的基本原理、卡尔曼滤波器的设计以及在组合导航系统中的应用。通过对卡尔曼滤波器进行参数调整,可以获得更加精确和鲁棒的估算结果。论文还介绍了常见的组合导航系统误差来源和校正方法,如组合导航系统的偏差校正和辅助自适应滤波等。 总之,卡尔曼滤波与组合导航原理是一详细介绍组合导航系统原理和卡尔曼滤波算法的经典论文,为研究者提供了丰富的技术参考和应用方案。通过深入了解组合导航系统原理和卡尔曼滤波算法,可以为机器人导航、人机交互、智能运输等领域的研究提供理论基础和技术支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值