几种判断应用(Android App)前后台状态的方法
2016-08-11 13:19
399 查看
很多应用,在某些场景下可能需要判断应用的前后台状态,来实现某些功能,例如应用锁。
本文提供几种判断应用前后台状态的方法,这几种方法我在使用的过程中发现都有各自的局限性或者缺点。下面直接看方法吧。
**
![](https://img-blog.csdn.net/20160811104520515)
上面这种方式需要权限android:name=”android.permission.GET_TASKS”
且这个getRunningTasks已经过期了,Android L开始,Google开始对getRunningTasks接口进行限制使用。
但是我在实际使用过程中,(Genymotion模拟器),在5.1和6.0的机器上,还是能够正常使用获取到包名,所以有清楚的朋友们告诉我下咯。
方法2在Android6.0的机器上,在某些情景下使用无法获取到当前正在运行的包名。
在屏幕暗下后,使用以下方法,可能会获取不到正确的进程列表
![](https://img-blog.csdn.net/20160811110142638)
![](https://img-blog.csdn.net/20160811111839030)
![](https://img-blog.csdn.net/20160811111853474)
![](https://img-blog.csdn.net/20160811111937593)
上面这种方式是通过自己统计Activity的生命周期来判断自己的应用是否是处于前台还是后台,当然这种方法ActivityLifecycleCallbacks是API14之后才提供的,我们可以通过baseActivity这种方式,在基类中统计这个次数,也能得到这个前后台状态的结果。这种方法也是我目前认为最为靠谱的一种方式,但是这种方法也还是有一定的局限性啊
在某些情景下依旧没办法使用,上面这种方式是在Activity-onStop后进行自减,如果我们是监听锁屏后在屏幕暗下后做处理,我们的App在屏幕暗下之前仍处于前台,在得到锁屏通知之后这个时候判断自己的App是否处于前后台,得到的结果会是我们的应用处于后台。因为我们在监听锁屏系统广播Screen-on or Screen off.,在收到Screen off.的时候我们的App的处于栈顶的Activity已经onStop了。所以得不到正确的结果。如果朋友们有好的方法,希望能告诉我一下。
本文提供几种判断应用前后台状态的方法,这几种方法我在使用的过程中发现都有各自的局限性或者缺点。下面直接看方法吧。
**
1. 方法一 通过getRunningTasks获取
**上面这种方式需要权限android:name=”android.permission.GET_TASKS”
且这个getRunningTasks已经过期了,Android L开始,Google开始对getRunningTasks接口进行限制使用。
但是我在实际使用过程中,(Genymotion模拟器),在5.1和6.0的机器上,还是能够正常使用获取到包名,所以有清楚的朋友们告诉我下咯。
2. 方法二 通过getRunningTasks和RunningAppProcessInfo结合,兼容API22+和API22-。
/** * 查询当前进程名 * * @param context * @return */ public static String getCurrentPkgName(Context context) { ActivityManager am = (ActivityManager) context .getSystemService(Context.ACTIVITY_SERVICE); String pkgName = null; if (Build.VERSION.SDK_INT >= 22) { ActivityManager.RunningAppProcessInfo currentInfo = null; Field field = null; int START_TASK_TO_FRONT = 2; try { field = ActivityManager.RunningAppProcessInfo.class .getDeclaredField("processState"); } catch (Exception e) { e.printStackTrace(); } List<RunningAppProcessInfo> appList = am.getRunningAppProcesses(); for (ActivityManager.RunningAppProcessInfo app : appList) { if (app.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND) { Integer state = null; try { state = field.getInt(app); } catch (Exception e) { e.printStackTrace(); } if (state != null && state == START_TASK_TO_FRONT) { currentInfo = app; break; } } } if (currentInfo != null) { pkgName = currentInfo.processName; } } else { List<RunningTaskInfo> runTaskInfos = am.getRunningTasks(1); // 拿到当前运行的任务栈 ActivityManager.RunningTaskInfo runningTaskInfo = runTaskInfos .get(0); // 拿到要运行的Activity的包名 pkgName = runningTaskInfo.baseActivity.getPackageName(); } return pkgName; }
方法2在Android6.0的机器上,在某些情景下使用无法获取到当前正在运行的包名。
在屏幕暗下后,使用以下方法,可能会获取不到正确的进程列表
3. 方法三 使用registerActivityLifecycleCallbacks统计
上面这种方式是通过自己统计Activity的生命周期来判断自己的应用是否是处于前台还是后台,当然这种方法ActivityLifecycleCallbacks是API14之后才提供的,我们可以通过baseActivity这种方式,在基类中统计这个次数,也能得到这个前后台状态的结果。这种方法也是我目前认为最为靠谱的一种方式,但是这种方法也还是有一定的局限性啊
在某些情景下依旧没办法使用,上面这种方式是在Activity-onStop后进行自减,如果我们是监听锁屏后在屏幕暗下后做处理,我们的App在屏幕暗下之前仍处于前台,在得到锁屏通知之后这个时候判断自己的App是否处于前后台,得到的结果会是我们的应用处于后台。因为我们在监听锁屏系统广播Screen-on or Screen off.,在收到Screen off.的时候我们的App的处于栈顶的Activity已经onStop了。所以得不到正确的结果。如果朋友们有好的方法,希望能告诉我一下。
相关文章推荐
- Android开发判断一个app应用是否在运行的方法详解
- Android判断App前台运行还是后台运行(运行状态)
- 判断Android程序前后台切换的几种方法
- 判断Android程序前后台切换的几种方法
- Android 判断应用前后台运行状态并获取当前 Activity 实例
- Android开发实现根据包名判断App运行状态的方法
- Android App如何判断应用是否在前台还是处于后台
- Android对App前后台运行状态的判断
- Android判断App前台运行还是后台运行(运行状态)
- Android判断APP当前状态,处于前台还是后台或者未启动
- 判断Android程序前后台切换的几种方法
- Android 判断App前后台运行状态
- 判断Android程序前后台切换的几种方法
- 六种判断android应用前后台方法
- android下判断一个应用app是否是系统rom集成的方法
- android判断app前后台状态
- android判断应用是否在后台运行的方法
- android下判断一个应用app是否是系统rom集成的方法
- Android 判断应用前后台运行状态并获取当前 Activity 实例