android 5.0适配TopActivity获取

最近因为项目需要,调研了下android 5.0 获取topActivity的方法,网上相关资料比较少,特写出来跟大家分享下。

5.0以下系统获取topActivity的方法,相信大家都很熟悉了,比较容易找,总结起来我用过的大概有两种:

ActivityManager am = (ActivityManager) context.getSystemService(Activity.ACTIVITY_SERVICE);if (am == null) {return null;}

List<RunningTaskInfo> tasks = am.getRunningTasks(1);if (tasks != null && !tasks.isEmpty()) {ComponentName componentName = tasks.get(0).topActivity;if (componentName != null) {return componentName.getClassName();}}

这个可以得到目前topActivity的类名,注意是类名而不是包名,想获取包名调用getPackageName方法

第二种是专门针对输入法服务的

PackageInfo pkgInfo;pkgInfo = mContext.getPackageManager().getPackageInfo(InputMethodService.getCurrentInputEditorInfo().packageName, 0);mTopActivity = pkgInfo.packageName;

这里的InputMethodService使用时要把它换成自己的输入法服务对象,这个调用会获取引起输入法弹起界面的应用包名

下面来说5.0系统,,5.0系统第一种方法已经不适用了,它会始终获取LauncherActivity的类名,由于安全性,还是怎么考虑,5.0里面已经不提供获取topActivity类名的方法了,只能获取包名,还得采取另一种方式,至少我没有调研出来方法,所以只能退而求其次的取其包名,至于包名的获取,上面说的第一种方法不可用,第二种仍然适用,此外还有种通用的方法,代码如下:

public static String getTopActivity(Context context) {if (context == null) {return null;}ActivityManager am = (ActivityManager) context.getSystemService(Activity.ACTIVITY_SERVICE);if (am == null) {return null;}if (Build.VERSION.SDK_INT <= 20) {List<RunningTaskInfo> tasks = am.getRunningTasks(1);if (tasks != null && !tasks.isEmpty()) {ComponentName componentName = tasks.get(0).topActivity;if (componentName != null) {return componentName.getClassName();}}} else {RunningAppProcessInfo currentInfo = null;Field field = null;int START_TASK_TO_FRONT = 2;String pkgName = null;try {field = RunningAppProcessInfo.class.getDeclaredField("processState");} catch (Exception e) {return null;}List<RunningAppProcessInfo> appList = am.getRunningAppProcesses();if (appList == null || appList.isEmpty()) {return null;}for (RunningAppProcessInfo app : appList) {if (app != null && app.importance == RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {Integer state = null;try {state = field.getInt(app);} catch (Exception e) {return null;}if (state != null && state == START_TASK_TO_FRONT) {currentInfo = app;break;}}}if (currentInfo != null) {pkgName = currentInfo.processName;}return pkgName;}return null;}其中20是区分5.0系统的分水岭。

版权声明:本文为博主原创文章,未经博主允许不得转载。

你在雨中行走,你从不打伞,你有自己的天空,它从不下雨。

android 5.0适配TopActivity获取

相关文章:

你感兴趣的文章:

标签云: