2 kedongjun kedongjun 于 2015.06.05 14:46 提问

android 5.0之后如何获取当前运行的应用包名?

1,先看看android5.0之前的获取方法:

// 1、得到当前运行的任务栈,参数就是得到多少个任务栈,1就是只拿一个任务栈
// 对应的也就是正在运行的任务栈啦 ,注意别忘了在清单文件中添加获取的权限
List runTaskInfos =
activityManager.getRunningTasks(1);
//拿到当前运行的任务栈
ActivityManager.RunningTaskInfo runningTaskInfo = runTaskInfos.get(0);
//拿到要运行的Activity的包名
runningpackageName = runningTaskInfo.baseActivity.getPackageName();

2,但是5.0之后这个方法失效了。搜索到如下解决方法:
public static String getCurrentPkgName(Context context) {
ActivityManager.RunningAppProcessInfo currentInfo = null;
Field field = null;
int START_TASK_TO_FRONT = 2;
String pkgName = null;
try {
field = ActivityManager.RunningAppProcessInfo.class.getDeclaredField("processState");
} catch (Exception e) { e.printStackTrace(); }
ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
List 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;
}
return pkgName;
}

3,然而上面的方法是得到却是当前Activity的进程名,一般进程名就是包名,但是如果在Manifest设置Activity的进程名,上面方法就无效了,如:

android:name="com.xxx.demo.DemoActivity"
android:process=".aaa" />

Log.d(TAG, "当前包名:" + runningpackageName );
06-05 11:09:44.284 32215-32276/com.xxx.demo D/AppService﹕ 当前包名:.aaa

4,除了上面获取方法,,求android 5.0之后获取当前运行的activity的包名的方法。

15个回答

LogicTeamLeader
LogicTeamLeader   2015.06.05 19:58

你想得到什么包名,是本app的包名么?直接在Activity中

 this.getPackageName();
bbs465
bbs465 这个谁不会?答非所问
大约一年之前 回复
fulai00
fulai00   2015.10.15 16:16

请问你是怎么解决的??求方法

mookerxing
mookerxing   2016.01.04 14:05

题主你好,最近碰巧也在做类似的功能。我是这么获取的:

ActivityManager activityManager = (ActivityManager) getContext().getSystemService(Context.ACTIVITY_SERVICE);
String _pkgName = activityManager.getRunningTasks(1).get(0).topActivity.getPackageName();

在MX4(Flyme5.0 基于Android5.1)上测试可行。

qq_31892203
qq_31892203 你真的确定你测试的是5.1的?
一年多之前 回复
u011596759
u011596759 弱弱的问一下,这个getSystemService报错,需要引进什么包?
接近 2 年之前 回复
mookerxing
mookerxing 额,抱歉,刚才才发现这样也会把Launcher这些也给读取到。。
接近 2 年之前 回复
zuishikonghuan
zuishikonghuan   2015.06.06 14:42

我有一个折中的办法,在JAVA端运行ps程序,拿到结果,根据结果把进程名比对,可以获得进程pid和uid,Android上应用都有自己的uid,然后通过pid和uid获取包名

sunnyleevip
sunnyleevip M还可以,N已经不行了。当然了,你这个方法满足6.0之前的了。
大约一年之前 回复
gaoyucindy
gaoyucindy   2015.10.21 17:31

可以通过RunningAppProcessInfo对象拿到uid,通过下面方法就能拿到包名
getPackageManager().getPackagesForUid(uid);

u011596759
u011596759   2016.01.12 21:40

弱弱的问一下,这个getSystemService报错,需要引进什么包?

u014422128
u014422128 系统app的
一年多之前 回复
u010689434
u010689434   2015.11.02 11:14

两种方法都测试了 还是取不到

naiwulrc
naiwulrc   2016.04.19 21:41

都没用啊这两种方法

u011596759
u011596759   2016.01.12 21:44

上一条整错地方了……

naiwulrc
naiwulrc   2016.04.19 21:35

ListappList = am.getRunningAppProcesses();
打漏了泛型了

共15条数据 1 尾页
Csdn user default icon
上传中...
上传图片
插入图片