Android 查询及获取应用程序 Package 及 Acticity 名称的方法
注意:在 Android 11 (API 30)中引入了包可见性的概念,即在 Android 11 及以上版本中将不能直接获取或查询到系统已安装的全部应用包名,包括第三方应用。最后通过上述 log 信息可知,包名为 com.android.gallery3d ,被启动的活动名为 GalleryActivity。查询包和安装信息(安装来源)
一、通过命令查询和获取应用的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类型的对象manager
PackageManager manager = context.getPackageManager();
//3. 通过调用manager.getInstalledPackages()获取的泛型为PackageInfo类型的List类型对象packageInfoList
List<PackageInfo> packageInfoList = manager.getInstalledPackages(0);
//4. 创建PackageInfo类型的变量info,用于接收packageInfoList对象中存储的PackageInfo类型数据
//,然后通过for循环遍历info
for (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
}
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)