呼叫Android系統“應用程式資訊(Application Info)”介面

銳湃發表於2015-08-11

呼叫Android系統“應用程式資訊(Application Info)”介面

ZhengZhiren

http://blog.csdn.net/ZhengZhiRen/archive/2011/01/23/6159750.aspx

 

“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);
}




相關文章