Android Lollipop 5.0 获取后台运行的APP包名
2015-06-03 16:53
645 查看
我们的应用要获取后台运行的app的包名,主要是getRunningTasks()方法的调用,经过测试在android 2.2 到 4.4的版本都运行的很好,但是在Android 5.0 Lollipop. 中获得不到,无法得到真实的后台运行app名称,在Android
5.0 Lollipop中获得的名称是 'Launcher3',我使用过的模拟器是 Genymotion Emulator。
下面是运行时的代码:
ActivityManager am = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
RunningTaskInfo foregroundTaskInfo = am.getRunningTasks(1).get(0);
String foregroundTaskPackageName = foregroundTaskInfo.topActivity .getPackageName();
原因是Android 5.0在API权限上作了修改:
Android L, Google has disabled getRunningTasks.
Now it can only return own apps task and the home launcher.
处理方法
参考文档:http://stackoverflow.com/questions/24625936/getrunningtasks-doesnt-work-in-android-l
5.0 Lollipop中获得的名称是 'Launcher3',我使用过的模拟器是 Genymotion Emulator。
下面是运行时的代码:
ActivityManager am = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
RunningTaskInfo foregroundTaskInfo = am.getRunningTasks(1).get(0);
String foregroundTaskPackageName = foregroundTaskInfo.topActivity .getPackageName();
原因是Android 5.0在API权限上作了修改:
Android L, Google has disabled getRunningTasks.
Now it can only return own apps task and the home launcher.
处理方法
参考文档:http://stackoverflow.com/questions/24625936/getrunningtasks-doesnt-work-in-android-l
public class DetectCalendarLaunchRunnable implements Runnable { @Override public void run() { String[] activePackages; if (Build.VERSION.SDK_INT > Build.VERSION_CODES.KITKAT_WATCH) { activePackages = getActivePackages(); } else { activePackages = getActivePackagesCompat(); } if (activePackages != null) { for (String activePackage : activePackages) { if (activePackage.equals("com.google.android.calendar")) { //Calendar app is launched, do something } } } mHandler.postDelayed(this, 1000); } String[] getActivePackagesCompat() { final List<ActivityManager.RunningTaskInfo> taskInfo = mActivityManager.getRunningTasks(1); final ComponentName componentName = taskInfo.get(0).topActivity; final String[] activePackages = new String[1]; activePackages[0] = componentName.getPackageName(); return activePackages; } String[] getActivePackages() { final Set<String> activePackages = new HashSet<String>(); final List<ActivityManager.RunningAppProcessInfo> processInfos = mActivityManager.getRunningAppProcesses(); for (ActivityManager.RunningAppProcessInfo processInfo : processInfos) { if (processInfo.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND) { activePackages.addAll(Arrays.asList(processInfo.pkgList)); } } return activePackages.toArray(new String[activePackages.size()]); } }
相关文章推荐
- iOS手动实现缓存机制(以FMDB实现)
- android aidl 自定义类型 作参数
- Android绘制空心矩形示例
- Android可在全屏幕自由拖动的view
- iOS应用内支付的那些坑儿
- 全面介绍Android的MVVM框架 - 数据绑定
- 菜鸟学Android笔记(十九):Servlet快速入门
- iOS开发 - 静态库中使用category
- Android 所占权重的设置
- Android --first
- Android 双击退出应用
- Android View绘制原理分析
- Android4.4----Vold挂载管理分析USB挂载(三)
- Android APP代码拨打电话、打开手机分享功能等隐式意图
- Android Studio Note
- Android android:gravity与 android:layout_gravity的区别
- android 多个Icon启动多个入口Activity
- android AsyncTask介绍
- android 高德地图出现【定位失败key鉴权失败】
- Android传感器的运用之ACCELEROMETER