获取安卓应用的包名和入口 Activity

博客: 安卓之家
微博: 追风917
CSDN: 蒋朋的家
简书: 追风917

景色无边

最近要定制个Launcher,最后选择了 Launcher3,要在4.4上跑,掉坑里去了,太深 :sob:

首先在桌面上要显示一些应用的快捷方式,小部件之类的,这就需要知道他们的包名入口 Activity.

获取应用包名


  • adb 命令获取

这个有以下几种方式:

1 经常用R.E管理器的同学,应该知道在系统/data/data目录下存着该手机所有的应用数据,并且是以包名为文件夹命名的,so直接ls查看就可以了

1
2
adb shell //进入系统终端
cd /data/data && ls

window用户找不到adb命令的,请把adb目录加入到环境变量里。

请看:

adb1s

我的终端是git带的,还不错的。

2 包管理器pm获取

1
2
3
adb shell
pm list package
pm list package -f//显示的更详细些

请看:

pmlist

pmlistf

  • 代码获取

我们都知道,开发的安卓app的AndroidManifest.xml文件里有一个起始 Activity,包含如下过滤信息:

1
2
3
4
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>

因此可以根据这个来获取包名和入口 Activity,具体代码在后面,请稍等。。。

获取应用的入口 Activity

  • aapt工具

这个必须获取到app才能继续,可以通过Android Device Monitor工具,pull到桌面,(直接adb pull 出现问题,搞不懂)然后进行下面,可以同时获取包名和入口 Activity

1
aapt dump badging ***.apk

找不到的,把该工具加入环境变量,我的在这里:D:\Android\Sdk\build-tools\23.0.2

请看:

appt

网上找了个脚本,我放到了这个 Gist, Come on, boy.

运行脚本,搞掂,这样:

sh

  • 反编译工具apktool
1
apktool.bat d ***.apk

之后找到AndroidManifest.xml文件,后面你们都知道了,搞定。

  • 代码获取
1
2
3
4
5
6
7
8
9
10
11
Intent intent = new Intent(Intent.ACTION_MAIN, null);
intent.addCategory(Intent.CATEGORY_LAUNCHER);

List<ResolveInfo> packageInfos = getPackageManager().queryIntentActivities(intent, 0);

for (int i = 0; i < packageInfos.size(); i++) {
String launcherActivityName = packageInfos.get(i).activityInfo.name;
String packageName = packageInfos.get(i).activityInfo.packageName;
Log.i("appappinfo", i + " -- launcherActivityName: " + launcherActivityName);
Log.e("appappinfo", i + " -- packageName: " + packageName);
}

好了,这样就搞掂,enjoy。

获取小部件包名和类名


  • 代码实现
1
2
3
4
5
6
7
8
9
10
List<AppWidgetProviderInfo> widgetProviderInfos = AppWidgetManager.getInstance(this).getInstalledProviders();

Log.d("widget", "allWidgetSize = " + widgetProviderInfos.size());
for (int i = 0; i < widgetProviderInfos.size(); i++) {
AppWidgetProviderInfo info = widgetProviderInfos.get(i);
String packageName = info.provider.getPackageName(); //获取包名
String className = info.provider.getClassName(); //获取类名
Log.d("widget", "packageName: " + packageName);
Log.d("widget", "className: " + className);
}

根据包名打开该应用


1
2
3
4
public static void openApp(Context context,String packageName) throws Exception{
Intent intent = context.getPackageManager().getLaunchIntentForPackage(packageName);
context.startActivity(intent);
}

That’ all.

最后,非常感谢您的阅读,有任何疑问,可以后面评论,谢谢!

神奇的安卓开发网站:http://androidcat.com/

安卓开源库收集整理:https://github.com/XXApple/AndroidLibs

分享是一种美德,更是一种生活方式!!

也许你会说我是一个梦想者,但我不是唯一的一个。

悦分享,越快乐^_^

欢迎交流,转载请注明出处,谢谢!

文章目錄
  1. 1. 获取应用包名
  2. 2. 获取应用的入口 Activity
  3. 3. 获取小部件包名和类名
  4. 4. 根据包名打开该应用
,
Fork me on GitHub