检测应用位于后台,并弹出手势解锁,解锁成功进入主界面
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
相关文章推荐
- iOS开发-进入后台后打开指定页面,如手势解锁
- IOS本地通知(注意本地通知在应用内不能弹出,应用进入后台才能)
- 解决本地安装magento成功后无法进入后台的问题
- VC DataGrid使用问题,在其它电脑上,应用数据程序弹出“未成功配置,应用程序无法启动”
- 唤醒锁: 检测 Android* 应用中的 No-Sleep(无法进入睡眠)问题
- Swift - 程序进入后台,以及应用终止时调用的方法
- 唤醒锁: 检测 Android* 应用中的 No-Sleep(无法进入睡眠)问题
- Winform登录窗体登录仿asp.net验证成功后进入主界面
- 多窗口类似支付宝,百度云的保护页面,当软件进入后台后,生成保护页面来验证,验证成功以后继续操作
- iOS开发之应用内检测手机锁屏,解锁状态
- 唤醒锁: 检测 Android* 应用中的 No-Sleep(无法进入睡眠)问题
- Android 应用home键,来电或者其他方式进入后台运行,再次进入程序需要重新登录问题
- IOS 应用检测碰擦手势分析
- <Android+Java>设置开机启动---开机解锁并直接进入应用
- iPhone/iPad高级应用与手游开发学习笔记:多点触摸与手势检测(三:UIPinchGestureRecognizer和UIRotationGestureRecognizer)
- [Android实例] 唤醒锁: 检测 Android 应用中的 No-Sleep(无法进入睡眠)问题 (转载)
- magento本地安装成功后无法进入后台,密码和用户名均正确 .
- iPhone/iPad高级应用与手游开发学习笔记:多点触摸与手势检测(二:UIPinchGestureRecognizer)
- 应用退到后台,返回主界面
- iOS开发UI篇—实现一个简单的手势解锁应用(基本)