Android 前后台进程切换判断
来源:互联网 发布:淘宝签署开店无法同意 编辑:程序博客网 时间:2024/06/05 05:29
项目有个需求是,应用退到后台 5 分钟以后再回到前台弹出手势密码锁界面提示用户解锁,目前已经完成分享一下实现的方法
public class GestureLockManager { private DownTimer downTimer; private boolean isFromBack; private boolean isPop; private static GestureLockManager sS; private GestureLockManager() { } static { sS = new GestureLockManager(); } public static GestureLockManager getInstance() { if (sS == null) { sS = new GestureLockManager(); } return sS; } public void init() { //need Android API > 14 RceApp.getInstance().registerActivityLifecycleCallbacks(new Application.ActivityLifecycleCallbacks() { @Override public void onActivityCreated(Activity activity, Bundle savedInstanceState) {//进程启动 if (activity.getClass().equals(MainActivity.class)) { isFromBack = false; long cacheTime = CacheTask.getInstance().getGestureTime(); long currentTime = System.currentTimeMillis(); if (cacheTime != 0 && (currentTime - cacheTime) / 60000 > 5 && activity.getIntent() != null && activity.getIntent().getData() != null && "true".equals(activity.getIntent().getData().getQueryParameter("isFromPush"))) { activity.startActivity(new Intent(activity, GestureLoginActivity.class)); //如果不是第一次安装而且杀进程时间间隔大于 5 分钟 并且 是来的 push 消息 } } } @Override public void onActivityStarted(Activity activity) {//进程在前台 if (!io.rong.common.SystemUtils.isInBackground(activity) && isFromBack && LoginActivity.class != activity.getClass()) { downTimer.stopDown(); if (isPop && CacheTask.getInstance().getGestureLock() != null) { activity.startActivity(new Intent(activity, GestureLoginActivity.class)); } isPop = false; isFromBack = false; } } @Override public void onActivityResumed(Activity activity) { } @Override public void onActivityPaused(Activity activity) { } @Override public void onActivityStopped(Activity activity) {//进程切入后台 if (io.rong.common.SystemUtils.isInBackground(activity)) { isFromBack = true; downTimer.startDown(1000 * 60 * 5); } } @Override public void onActivitySaveInstanceState(Activity activity, Bundle outState) { } @Override public void onActivityDestroyed(Activity activity) {//进程被杀死 if (activity.getClass().equals(MainActivity.class)) { CacheTask.getInstance().cacheGestureTime(currentTimeMillis()); //TODO 可能存在杀死进程没有 cache 当前时间戳的情况 } } }); downTimer = new DownTimer(); downTimer.setListener(new DownTimer.DownTimerListener() { @Override public void onFinish() { isPop = true; } }); }}
上面是主要实现代码,建议在 application 类做初始化
GestureLockManager.getInstance().init();
其中工具类判断的关键代码
public static boolean isInBackground(Context context) { boolean isInBackground = true; ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); if (Build.VERSION.SDK_INT > Build.VERSION_CODES.KITKAT_WATCH) { List<ActivityManager.RunningAppProcessInfo> runningProcesses = am.getRunningAppProcesses(); if (runningProcesses == null) { return false; } for (ActivityManager.RunningAppProcessInfo processInfo : runningProcesses) { //前台程序 if (processInfo.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND) { for (String activeProcess : processInfo.pkgList) { if (activeProcess.equals(context.getPackageName())) { return false; } } } } } else { List<ActivityManager.RunningTaskInfo> taskInfo = am.getRunningTasks(1); ComponentName componentInfo = taskInfo.get(0).topActivity; if (componentInfo.getPackageName().equals(context.getPackageName())) { isInBackground = false; } } return isInBackground; }
最后需要记得这个 API 是需要大于 14 才可以使用,对 4.0 以下的手机应该是无效的。
阅读全文
0 0
- Android 前后台进程切换判断
- Android应用前后台切换的判断
- Android:应用前后台切换判断
- Android应用前后台切换的判断
- Android应用前后台切换的判断
- Android前后台切换
- Linux 前后台进程切换
- Linux 前后台进程切换
- Linux前后台进程切换
- 【linux】前后台进程切换
- Linux 前后台进程切换
- Linux 前后台进程切换
- linux 进程前后台切换
- Linux 前后台进程切换
- linux进程前后台切换
- Linux 前后台进程切换
- linux前后台进程切换
- linux 进程前后台切换
- 求序列中最大子序列和(分治算法)
- 10.函数参数传递的三种方式
- jsp和servlet常见问题总结
- Mac下查看JDK路径配置JAVA_HOME安装maven
- JSP页面九大内置对象
- Android 前后台进程切换判断
- dubbo源码分析-consumer端6-数据发送与接收
- Java 网络编程
- 不找C++的工作也要学C++
- python编程1-win7上运行python
- volatile变量与普通变量的区别
- Struts2实现文件上传和下载
- 调用系统裁剪 并生成图片
- 监控redis命令--monitor--redis调试