调用Android系统“应用程序信息(Application Info)”界面

本文介绍如何在Android中通过SDK接口或非公开接口调用系统的应用程序信息界面,包括卸载和启动软件的功能,适用于Android 2.3及以上版本。详细解释了在不同Android版本中实现的方法差异,提供了通用的调用代码和实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

“Android系统设置->应用程序->管理应用程序”列表下,列出了系统已安装的应用程序。选择其中一个程序,则进入“应用程序信息(Application Info)”界面。这个界面显示了程序名称、版本、存储、权限等信息,并有卸载、停止、清除缓存等按钮,可谓功能不少。如果在编写相关程序时(比如任务管理器)可以调用这个面板,自然提供了很大的方便。那么如何实现呢?

在最新的Android SDK 2.3(API Level 9)中,提供了这样的接口。在文档路径

docs/reference/android/provider/Settings.html#ACTION_APPLICATION_DETAILS_SETTINGS

下,有这样的描述:

public static final String ACTION_APPLICATION_DETAILS_SETTINGS    Since: API Level 9

Activity Action: Show screen of details about a particular application.
In some cases, a matching Activity may not exist, so ensure you safeguard against this.
Input: The Intent's data URI specifies the application package name to be shown, with the "package" scheme. That is "package:com.my.app".
Output: Nothing.
Constant Value: "android.settings.APPLICATION_DETAILS_SETTINGS"

就是说,我们只要以android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS作为Action;package:应用程序的包名作为URI,就可以用startActivity启动应用程序信息界面了。代码如下:

Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);  

Uri uri = Uri.fromParts(SCHEME, packageName, null);  

intent.setData(uri);  

startActivity(intent);  

 
但是,在Android 2.3之前的版本,并没有公开相关的接口。
通过查看系统设置 platform/packages/apps/Settings.git程序的源码,可以发现应用程序信息界面为InstalledAppDetails。
这里(2.1)还有 这里(2.2),我们可以分别看到 Android2.1Android2.2的应用管理程序(ManageApplications.java)是如何启动InstalledAppDetails的。

// utility method used to start sub activity  

private void startApplicationDetailsActivity() {  

    // Create intent to start new activity  

    Intent intent = new Intent(Intent.ACTION_VIEW);  

    intent.setClass(this, InstalledAppDetails.class);  

    intent.putExtra(APP_PKG_NAME, mCurrentPkgName);  

    // start new activity to display extended information  

    startActivityForResult(intent, INSTALLED_APP_DETAILS);  

}  

但是常量APP_PKG_NAME的定义并不相同。
2.2中定义为"pkg",2.1中定义为"com.android.settings.ApplicationPkgName"
那么, 对于2.1及以下版本,我们可以这样调用InstalledAppDetails:

Intent i = new Intent(Intent.ACTION_VIEW);                  

i.setClassName("com.android.settings","com.android.settings.InstalledAppDetails");  

i.putExtra("com.android.settings.ApplicationPkgName", packageName);   

startActivity(i);  

对于2.2,只需替换上面putExtra的第一个参数为"pkg"
 
 
综上,通用的调用“应用程序信息”的代码如下:
private static final String SCHEME = "package";
/**
 * 调用系统InstalledAppDetails界面所需的Extra名称(用于Android 2.1及之前版本)
 */
private static final String APP_PKG_NAME_21 = "com.android.settings.ApplicationPkgName";
/**
 * 调用系统InstalledAppDetails界面所需的Extra名称(用于Android 2.2)
 */
private static final String APP_PKG_NAME_22 = "pkg";
/**
 * InstalledAppDetails所在包名
 */
private static final String APP_DETAILS_PACKAGE_NAME = "com.android.settings";
/**
 * InstalledAppDetails类名
 */
private static final String APP_DETAILS_CLASS_NAME = "com.android.settings.InstalledAppDetails";
/**
 * 调用系统InstalledAppDetails界面显示已安装应用程序的详细信息。 对于Android 2.3(Api Level
 * 9)以上,使用SDK提供的接口; 2.3以下,使用非公开的接口(查看InstalledAppDetails源码)。
 * 
 * @param context
 * 
 * @param packageName
 *            应用程序的包名
 */
public static void showInstalledAppDetails(Context context, String packageName) {
	Intent intent = new Intent();
	final int apiLevel = Build.VERSION.SDK_INT;
	if (apiLevel >= 9) { // 2.3(ApiLevel 9)以上,使用SDK提供的接口
		intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
		Uri uri = Uri.fromParts(SCHEME, packageName, null);
		intent.setData(uri);
	} else { // 2.3以下,使用非公开的接口(查看InstalledAppDetails源码)
		// 2.2和2.1中,InstalledAppDetails使用的APP_PKG_NAME不同。
		final String appPkgName = (apiLevel == 8 ? APP_PKG_NAME_22
				: APP_PKG_NAME_21);
		intent.setAction(Intent.ACTION_VIEW);
		intent.setClassName(APP_DETAILS_PACKAGE_NAME,
				APP_DETAILS_CLASS_NAME);
		intent.putExtra(appPkgName, packageName);
	}
	context.startActivity(intent);
}
 
到卸载页面
List<PackageInfo>  apkInfos=pm.getInstalledPackages(0);
Uri uri = Uri.fromParts("package", apkInfos.get(pos).packageName, null);
Intent intent = new Intent(Intent.ACTION_DELETE, uri);
startActivity(intent);
 启动软件
String name = apkInfos.get(pos).packageName;
Intent intent = pm.getLaunchIntentForPackage(name);
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值