开发者社区> 技术小胖子> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

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

简介:
+关注继续查看

“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启动应用程序信息界面了。代码如下:


  1. Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);  
  2. Uri uri = Uri.fromParts(SCHEME, packageName, null);  
  3. intent.setData(uri);  
  4. startActivity(intent); 

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


  1. // utility method used to start sub activity  
  2. private void startApplicationDetailsActivity() {  
  3.     // Create intent to start new activity  
  4.     Intent intent = new Intent(Intent.ACTION_VIEW);  
  5.     intent.setClass(this, InstalledAppDetails.class);  
  6.     intent.putExtra(APP_PKG_NAME, mCurrentPkgName);  
  7.     // start new activity to display extended information  
  8.     startActivityForResult(intent, INSTALLED_APP_DETAILS);  

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


  1. Intent i = new Intent(Intent.ACTION_VIEW);                  
  2. i.setClassName("com.android.settings","com.android.settings.InstalledAppDetails");  
  3. i.putExtra("com.android.settings.ApplicationPkgName", packageName);   
  4. startActivity(i); 

对于2.2,只需替换上面putExtra的第一个参数为"pkg"
 
 
综上,通用的调用“应用程序信息”的代码如下:


  1. private static final String SCHEME = "package";  
  2. /**  
  3.  * 调用系统InstalledAppDetails界面所需的Extra名称(用于Android 2.1及之前版本)  
  4.  */ 
  5. private static final String APP_PKG_NAME_21 = "com.android.settings.ApplicationPkgName";  
  6. /**  
  7.  * 调用系统InstalledAppDetails界面所需的Extra名称(用于Android 2.2)  
  8.  */ 
  9. private static final String APP_PKG_NAME_22 = "pkg";  
  10. /**  
  11.  * InstalledAppDetails所在包名  
  12.  */ 
  13. private static final String APP_DETAILS_PACKAGE_NAME = "com.android.settings";  
  14. /**  
  15.  * InstalledAppDetails类名  
  16.  */ 
  17. private static final String APP_DETAILS_CLASS_NAME = "com.android.settings.InstalledAppDetails";  
  18. /**  
  19.  * 调用系统InstalledAppDetails界面显示已安装应用程序的详细信息。 对于Android 2.3(Api Level  
  20.  * 9)以上,使用SDK提供的接口; 2.3以下,使用非公开的接口(查看InstalledAppDetails源码)。  
  21.  *   
  22.  * @param context  
  23.  *   
  24.  * @param packageName  
  25.  *            应用程序的包名  
  26.  */ 
  27. public static void showInstalledAppDetails(Context context, String packageName) {  
  28.     Intent intent = new Intent();  
  29.     final int apiLevel = Build.VERSION.SDK_INT;  
  30.     if (apiLevel >= 9) { // 2.3(ApiLevel 9)以上,使用SDK提供的接口  
  31.         intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);  
  32.         Uri uri = Uri.fromParts(SCHEME, packageName, null);  
  33.         intent.setData(uri);  
  34.     } else { // 2.3以下,使用非公开的接口(查看InstalledAppDetails源码)  
  35.         // 2.2和2.1中,InstalledAppDetails使用的APP_PKG_NAME不同。  
  36.         final String appPkgName = (apiLevel == 8 ? APP_PKG_NAME_22  
  37.                 : APP_PKG_NAME_21);  
  38.         intent.setAction(Intent.ACTION_VIEW);  
  39.         intent.setClassName(APP_DETAILS_PACKAGE_NAME,  
  40.                 APP_DETAILS_CLASS_NAME);  
  41.         intent.putExtra(appPkgName, packageName);  
  42.     }  
  43.     context.startActivity(intent);  
  44. }  

 



     本文转自xyz_lmn51CTO博客,原文链接:http://blog.51cto.com/xyzlmn/817135,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Android 10.0 顶部状态栏系统图标显示分析
Android 10.0 顶部状态栏系统图标显示分析
0 0
Android进程守护,让APP在系统内存中常驻(二)
Android进程守护,让APP在系统内存中常驻
0 0
Android进程守护,让APP在系统内存中常驻(一)
Android进程守护,让APP在系统内存中常驻
0 0
深入分析 Android 系统返回手势的实现原理(2)
深入分析 Android 系统返回手势的实现原理(2)
0 0
深入分析 Android 系统返回手势的实现原理(1)
深入分析 Android 系统返回手势的实现原理(1)
0 0
从显示 Tap 位置的原理窥探 Android Input 系统
从显示 Tap 位置的原理窥探 Android Input 系统
0 0
Android刷linux系统
Android刷linux系统
0 0
文章
问答
文章排行榜
最热
最新
相关电子书
更多
Android组件化实现
立即下载
蚂蚁聚宝Android秒级编译—— Freeline
立即下载
Android插件化:从入门到放弃
立即下载