“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啟動應用程式資訊介面了。代碼如下:
view plain
- 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.1和
Android2.2的應用管理程式(ManageApplications.java)是如何啟動InstalledAppDetails的。view plain
- // 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:view plain
- 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"
綜上,通用的調用“應用程式資訊”的代碼如下:view plain
- 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);
- }