您的位置:首页 > 移动开发 > Android开发

检测应用位于后台,并弹出手势解锁,解锁成功进入主界面

2017-04-11 17:50 393 查看

功能描述:

1,开启了手势解锁,也就是打开了开关以后,第一次登陆进入会拦截下,判断有没有设置手势锁,有的话登录成功进入主界面前要弹出手势解锁界面,没有开启则直接进入主界面

2,在退出app,不是退出登录的情况下,也就是位于后台,再次进入如果开启了手势解锁要弹出解锁界面,没有则直接进入

3,不管是主界面还是其他,只要位于后台了,开启了手势解锁,再次进入弹出解锁,解锁成功进入主界面,也不管他之前停留的界面,只要解锁成功就是主界面

思路误区:

第一种想法是

在开关设置中,当开关打开则保存sp为true,否则为false,默认也为false,在BaseActivity的onResume或者onRestart方法中调用,根据sp的值进行判断,是否跳转到手势界面,最终失败,因为每个界面都会走这两个方法,导致跳转也会弹出手势界面,所以这个方法是不行的,第二种想法是创建一个service,在service里面获取当前应用的包名和手机栈顶应用包名,如果当前应用包名等于手机栈顶应用包名,说明用户打开了app,监听到用户打开了app,并且sp中的值为true,则弹出手势界面,在开关的打开关闭中开启和关闭服务,但是打开以后,每次进入在哪个方法中检查呢,试过了在application,但是application的oncreate是在创建时调用的,也不行,询问朋友,最终在朋友的帮助下得到解决,也是在BaseActivity里面操作,添加判断是否位于后台的方法。位于后台,且sp中的值为true,则弹出手势解锁,添加一个flag在默认flag为false,onStop中如果位于后台设置为true,判断flag是否为true,如果为true再判断sp中的值是否为true,如果两者都满足,则跳转到手势界面,当然在flag为true的代码块中,要把flag赋值为false,具体看代码

判断是否位于后台的方法

//判断App是否在后台运行
public static boolean isBackground(Context context) {
ActivityManager activityManager = (ActivityManager) context
.getSystemService(Context.ACTIVITY_SERVICE);
List<ActivityManager.RunningAppProcessInfo> appProcesses = activityManager
.getRunningAppProcesses();
for (ActivityManager.RunningAppProcessInfo appProcess : appProcesses) {
if (appProcess.processName.equals(context.getPackageName())) {
/*
BACKGROUND=400 EMPTY=500 FOREGROUND=100
GONE=1000 PERCEPTIBLE=130 SERVICE=300 ISIBLE=200
*/
Log.i(context.getPackageName(), "此appimportace ="
+ appProcess.importance
+ ",context.getClass().getName()="
+ context.getClass().getName());
if (appProcess.importance != ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {
Log.i(context.getPackageName(), "处于后台"
+ appProcess.processName);
return true;
} else {
Log.i(context.getPackageName(), "处于前台"
+ appProcess.processName);
return false;
}
}
}
return false;
}


flag初始为false

//标记APP是否从后台再次进入的flag
private boolean flag = false;


在stop方法中判断是否位于后台,如果是,则设置为true

@Override
protected void onStop() {
super.onStop();
boolean background = isBackground(BaseActivity.this);
Log.d("BaseActivity", "===onStop");
Log.d("BaseActivity", "background:" + background);
if (background) {
flag = true;
}
}


在onresume中再次判断

@Override
protected void onResume() {
super.onResume();
boolean background = isBackground(BaseActivity.this);
Log.d("BaseActivity", "===onResume");
Log.d("BaseActivity", "background:" + background);
if (flag) {
flag = false;
Boolean isGesture = SpUtils.getBoolean(BaseActivity.this, "isGesture");
Log.d("BaseActivity", "isGesture:" + isGesture);
if (isGesture){
Log.e("BaseActivity", "打开解锁界面");
Intent intent = new Intent(BaseActivity.this, GestureActivty.class);
startActivity(intent);
}

}
}


demo:demo
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐