OR博客
【应用锁(上)】确定什么时候弹出解锁界面
苗锦洲
创建于:2020-08-11 10:46:34
0
31
280
0
最近做APP的时候涉及到一个应用锁的功能,APP进入后台或者锁屏都要弹出解锁界面,虽说现在手机系统基本都有这个功能,不过有总比没有强,还可以练练手,也能用在其它地方,比如正在使用APP的时候收到新版本通知的时候也可以弹出一个“全局”对话框提醒用户,还有语音/视频通话请求、PC端请求手机授权登录等等。

最近做 APP 的时候涉及到一个应用锁的功能,APP 进入后台或者锁屏都要弹出解锁界面,虽说现在手机系统基本都有这个功能,不过有总比没有强,还可以练练手,也能用在其它地方,比如正在使用 APP 的时候收到新版本通知的时候也可以弹出一个“全局”对话框提醒用户,还有语音/视频通话请求、PC 端请求手机授权登录等等。

确定什么时候弹出锁屏界面

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/kaka123ac/article/details/42124569

功能:

1.应用程序程序中设置了密码锁,每当用户打开应用时,要弹出密码输入界面;
2.当用户按住 home 键,将程序隐在后台而非退出,经过一段时间后,再重新启动,也要弹出密码输入界面;
3.当应用在前台的时候,用户按住 power 电源键,关闭屏幕后,再点亮屏幕,这个时候也要弹出密码输入界面

实现方式:

1.针对功能 1,每次启动应用进入主界面时,判断是否需要弹出密码输入界面;

2.关键点在于怎么判断程序是否处在前台跟后台。

判断方法:

public static boolean isAppOnForeground(Context context) { ActivityManager activityManager = (ActivityManager) context.getApplicationContext().getSystemService(Context.ACTIVITY_SERVICE); String packageName = context.getApplicationContext().getPackageName(); List<RunningAppProcessInfo> appProcesses = activityManager.getRunningAppProcesses(); if(appProcesses == null) return false; for(RunningAppProcessInfo appProcess : appProcesses) { if(appProcess.processName.equals(packageName) && appProcess.importance == RunningAppProcessInfo.IMPORTANCE_FOREGROUND) { return true; } } return false; }

其主要原理是:获取当前正在运行的所有进程,根据进程名字进行逐一比较(默认应用程序进程名字为包名),
并且当前进程的 importance 为 IMPORTANCE_FOREGROUND,及该进程处在前台。

在 Activity 中加一个 boolean 变量 mIsActive = true,默认为 true。
在所有 Activity 的 onStop 中做一次判断:

protected void onStop() { super.onStop(); if(!isAppOnForeground(this)) { mIsActive = false; } }

在相应 Activity 的 onRestart()中判断:

protected void onRestart() { if(!mIsActive) { mIsActive = true; //弹出密码框输入界面 //.………... } }

3.监听锁屏广播:ACTION_SCREEN_ON

在 Application 里注册一个广播:

public static boolean IS_FOREGROUND = false; public class ScreenActionReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (action.equals(Intent.ACTION_SCREEN_ON)) { //用户点亮屏幕 //判断是否需要弹出密码锁来 if(IS_FOREGROUND) { //如果应用程序恰好处在前台,则弹出密码锁界面来 } } else if (action.equals(Intent.ACTION_SCREEN_OFF)) { //用户关闭屏幕 } }

在自己的 Application 的 onCreate()里注册该 BroadcastReceiverd 的实例:

if(mScreenActionReceiver == null) { mScreenActionReceiver = new ScreenActionReceiver(); IntentFilter screenfilter = new IntentFilter(); screenfilter.addAction(Intent.ACTION_SCREEN_OFF); screenfilter.addAction(Intent.ACTION_SCREEN_ON); registerReceiver(mScreenActionReceiver, screenfilter); }

注意点:

在收到屏幕点亮通知的时候,要判断应用程序是否在前台,如果不在前台,则不要把密码锁界面掉出来。
在这个时候调用 isAppOnForeground()方法,发现会返回 true,也就是程序在收到这个广播的时候,
系统认为应用跑到 foreground 来了。
解决方法:在 Application 中设置一个变量 IS_FOREGROUND,
在 Activity 的 onCreate()、onStop()、onRestart()中进行判断并设置该变量的值。

评论
楼主暂时不想被别人评论哦~