一、通过命令查询和获取应用的Package及Acticity
(一)通过命令查询应用包名及安装信息
以下是常用命令:
命令形式 | 作用 |
adb shell pm list packages | 查询系统中所有应用的包名 |
adb shell pm list packages -s | 查询系统应用包名 |
adb shell pm list packages -3 | 查询第三方应用包名 |
adb shell pm list packages -f | 查询系统中所有应用的包名及与包相关联的文件信息 |
adb shell pm list packages -u | 查询包和安装信息(安装来源) |
组合查询,例如
adb shell pm list packages -s -f
(二)通过命令获取当前应用包名及活动名称
1、常用方法
Linux系统查询命令(Linux 系统采用 grep 命令查询文件中的字符串):
adb shell dumpsys window | grep mCurrentFocus
Windows系统查询命令(Windows 系统采用 findstr 命令查询文件中的字符串):
adb shell dumpsys window | findstr mCurrentFocus
2、其他方法
先使用 adb logcat 或 adb logcat -s ActivityTaskManager 命令打印 log 信息,然后启动应用程序相应的活动,然后在 log 信息中找到含有 ActivityTaskManager 与启动 Activity 相关的信息,例如:
ActivityTaskManager: START u0 {act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 pkg=com.android.gallery3d cmp=com.android.gallery3d/.app.GalleryActivity bnds=[652,2035][795,2140]} from uid 10067
最后通过上述 log 信息可知,包名为 com.android.gallery3d ,被启动的活动名为 GalleryActivity
二、通过代码查询和获取应用程序的Package及Acticity
注意:在 Android 11 (API 30)中引入了包可见性的概念,即在 Android 11 及以上版本中将不能直接获取或查询到系统已安装的全部应用包名,包括第三方应用。所以,直接调用 PackageManager 的 getInstalledApplications() 、 getInstalledPackages() 等的方法后需要在清单文件中声明以下权限,否则只能获取或查询到部分已安装应用包名:
<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES"/>
(一)通过查询指定应用包名判断应用是否存在
public boolean isTargetPackageName(Context context, String packageName){PackageManager packageManager = context.getPackageManager();try {packageManager.getApplicationInfo(packageName, 0);return true;} catch (PackageManager.NameNotFoundException e) {e.printStackTrace();}return false;}
(二)获取系统所有的应用包名
public List<String> getAllApplicationPackages(Context context) {//1. 创建泛型为String类型的List类型对象packageList,用于缓存所有获取到的应用包名List<String> packageList = new ArrayList<String>();try{//2. 通过getPackageManager()获取PackageManager类型的对象managerPackageManager manager = context.getPackageManager();//3. 通过调用manager.getInstalledPackages()获取的泛型为PackageInfo类型的List类型对象packageInfoListList<PackageInfo> packageInfoList = manager.getInstalledPackages(0);//4. 创建PackageInfo类型的变量info,用于接收packageInfoList对象中存储的PackageInfo类型数据//,然后通过for循环遍历infofor (PackageInfo info : packageInfoList) {//5.将从info中获取到的应用包名packageName缓存到packageList对象中packageList.add(info.packageName);Log.i("MainActivity", "----------packageName = " + info.packageName);}} catch (Exception e){e.printStackTrace();}return packageList;}
(三)判断通过 Intent 启动 Acticity 是否存在
if (getPackageManager().resolveActivity(intent, 0) == null) { // 说明系统中不存在这个activity}if (intent.resolveActivity(getPackageManager()) == null) { // 说明系统中不存在这个activity}List<ResolveInfo> list = getPackageManager().queryIntentActivities(intent, 0);if (list.size() == 0) { // 说明系统中不存在这个activity}