监听屏幕锁屏和解锁事件
/**
* 屏幕解锁、锁屏广播管家 初始化
*/
public static ScreenBroadCastManager sbManager;
//启动屏幕监听管家
sbManager = new ScreenBroadCastManager();
sbManager.registerScreenBroadCastReceiver(getApplicationContext());
启动时进行检测
//检查并打开手势密码界面
BaseHandler.checkLockParten(this,userManager);
基类中全局进行监听
/**
* 注册屏幕锁屏和解锁监听事件
*/
App.sbManager.setListener(new ScreenBroadCastManager.ScreenBroadCastListener() {
@Override
public void onScreenOn() {
}
@Override
public void onScreenOFF() {
//如果锁屏的时候当前任务是手厅,并且本身不是手势密码界面,那么锁屏后打开手势密码校验界面,解锁后直接就可以看到
ComponentName cn = am.getRunningTasks(1).get(0).topActivity;
if(cn.getPackageName().trim().equals(getPackageName())
&& !"group.pals.android.lib.ui.lockpattern.LockPatternActivity".equals(cn.getClassName().trim()) ){
//Log.i(TAG, "锁屏--打开手势校验界面");
BaseHandler.checkLockParten(BaseActivity.this,userManager);
}
}
});
}
构造广播监听锁屏截屏事件
public class ScreenBroadCastManager {
private ScreenBroadCastListener listener;
private ScreenBroadCastReceiver sbcr;
public void setListener(ScreenBroadCastListener listenerArg){
this.listener = listenerArg;
}
/**
* 构造一个广播接收器监听系统锁屏、解锁广播,并动态注册。
* 提供一个回调函数告诉系统监听到系统广播时应该做些什么。
* @param context
* @param listenerArg
*/
public void registerScreenBroadCastReceiver(Context context){
sbcr = new ScreenBroadCastReceiver();
//注册一个广播接收器,接收系统锁屏、解锁广播
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_SCREEN_OFF);
filter.addAction(Intent.ACTION_SCREEN_ON);
Log.i("ScreenBroadCastManager", "注册屏幕解锁、加锁广播接收者...");
context.registerReceiver(sbcr, filter);
}
class ScreenBroadCastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if(Intent.ACTION_SCREEN_ON.equals(intent.getAction())){
//解锁
if(listener!=null){
listener.onScreenOn();
}
}else if(Intent.ACTION_SCREEN_OFF.equals(intent.getAction())){
//锁屏
if(listener!=null){
listener.onScreenOFF();
}
}
}
}
public interface ScreenBroadCastListener {
public void onScreenOn();
public void onScreenOFF();
}
}
应用Application里面在onCreate中进行初始化
//初始化手势密码设置 最大重试次数和最小连接数
LockPatternUtil.init(getApplicationContext(), 5, 4);
/**
* 初始化
*
* @param context
* @param MaxRetry 最大重试次数
* @param MinWiredDots 最小连接数
*/
public static void init(Context context, int MaxRetry, int MinWiredDots) {
mContext = context;
SecurityPrefs.setAutoSavePattern(context, true);
//最大重试次数
DisplayPrefs.setMaxRetry(context, MaxRetry);
//最小连接点数
DisplayPrefs.setMinWiredDots(context, MinWiredDots);
}
设置回调相关
总代码:
public class BaseHandler {
public static void checkLockParten(final Context context, UserManager userManager) {
//用户是自动登录状态
if (userManager.getAutoLoginStatus()
&& !TextUtils.isEmpty(userManager.getUserAccountName())
&& !TextUtils.isEmpty(userManager.getUserPassword())
&& !TextUtils.isEmpty(userManager.getKeyVersion())
&& App.hasLogined()
&& LockPatternUtil.hasLockPattern(context)) {
//设置相关回调
LockPatternActivity.callBackInterface = new LockPatternActivity.CallBackInterface() {
@Override
public void onKeyDownForBack() {
//退回到桌面
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_HOME);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);
}
@Override
public void gotoLogin() {
//打开登录窗口,标识从解锁界面进入
Intent loginIntent = new Intent(context, LoginActivity.class);
//表示从手势密码界面进入登录
loginIntent.putExtra("fromLockPattern", "fromLockPattern");
//表示手势密码是后台切换回前台时显示出来的
loginIntent.putExtra("fromLockPatternbackground", "fromLockPatternbackground");
context.startActivity(loginIntent);
//删除手势密码
LockPatternUtil.clearLockPattern(context);
}
};
//打开验证界面
LockPatternUtil.compareLockPattern((Activity) context, userManager.getUserAccountName());
}
}
}
场景1:
从桌面打开APP,如果设置有手势锁的,则打开手势锁界面,打开后按下返回键,则应该退出到桌面。
//退回到桌面
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_HOME);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);
场景2:
在有手势锁的情况下,输入五次并错误时,次场景由有手势锁和从后台切换到前台时验证失败后拉起登录界面,根据业务场景清除所有用户登录相关信息,需要用户进行手动登录。
//打开登录窗口,标识从解锁界面进入
Intent loginIntent = new Intent(context, LoginActivity.class);
//表示从手势密码界面进入登录
loginIntent.putExtra("fromLockPattern", "fromLockPattern");
//表示手势密码是后台切换回前台时显示出来的
loginIntent.putExtra("fromLockPatternbackground", "fromLockPatternbackground");
context.startActivity(loginIntent);
//删除手势密码
LockPatternUtil.clearLockPattern(context);
网友评论