android 5.0适配TopActivity获取

来源:互联网 发布:2015网络歌曲男 编辑:程序博客网 时间:2024/05/20 23:36

最近因为项目需要,调研了下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系统的分水岭。

0 0