首先我们来看一下PackageItemInfo,它是包含了一些信息的基类,它的直接子类有:ApplicationInfo、ComponentInfo、
InstrumentationInfo、PermissionGroupInfo、PermissionInfo。它的间接子类有:ActivityInfo、ProviderInfo、ServiceInfo。这个类
包含的信息对于所有包中项目是平等的。这些Package items是被Package manager所持有的。这个类提供了属性的非常普通的基本设置:
label、icon和meta-data。这个类的意图不是被自己调用。它在这只是简单地分享被package manager返回的所有items之间的普通定义。比
如,它自己并不实现Parcelable接口,但却帮助实现了Parcelable的子类提供了方便的方法。
ApplicationInfo是从一个特定的应用得到的信息。这些信息是从相对应的Androdimanifest.xml的<application>标签中收集到的。
ResolveInfo这个类是通过解析一个与IntentFilter相对应的intent得到的信息。它部分地对应于从AndroidManifest.xml的<intent>标签收
集到的信息。
PackageManager这个类是用来返回各种的关联了当前已装入设备了的应用的包的信息。你可以通过getPacageManager来得到这个类。
ApplicationInfo与ResolveInfo比较:前者能够得到Icon、Label、meta-data、description。后者只能得到Icon、Label。
1 通过PackageManager获取手机已安装apk文件信息:
PackageManager packageManager = this.getPackageManager();  
List<PackageInfo> packageInfoList = packageManager.getInstalledPackages(0);
通过以上方法,可以得到手机中安装的所有应用程序,既包括了手动安装的apk包的信息,也包括了系统预装的应用软件的信息,要区分这
两类软件可使用以下方法:
a.从packageInfoList获取的packageInfo,再通过packageInfo.applicationInfo获取applicationInfo。
b.判断(applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM)的值,该值大于0时,表示获取的应用为系统预装的应用,反之则为手动
安装的应用。
c.判断可卸载的应用程序(appInfo.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0 || (appInfo.flags & 
ApplicationInfo.FLAG_SYSTEM) == 0)
2 获取图片、应用名、包名:
packageManager.getApplicationIcon(pinfo.applicationInfo); //Icon
packageManager.getApplicationLabel(pinfo.applicationInfo).toString()//应用程序名
pinfo.applicationInfo.packageName//包名
3 获取支持分享的应用程序的集合:
/** 
 * 查询手机内所有支持分享的应用 
 * @param context 
 * @return 
 */  
public static List<ResolveInfo> getShareApps(Context context){  
    List<ResolveInfo> mApps = new ArrayList<ResolveInfo>();    
    Intent intent=new Intent(Intent.ACTION_SEND,null);    
    intent.addCategory(Intent.CATEGORY_DEFAULT);    
    intent.setType("text/plain");    
    PackageManager pManager = context.getPackageManager();  
    mApps = pManager.queryIntentActivities(intent,PackageManager.COMPONENT_ENABLED_STATE_DEFAULT);   
    return mApps;    
}
由于该方法,返回的并不是 PackageInfo 对象。而是 ResolveInfo。因此获取图片、应用名、包名的方法不一样,如下:
view plaincopy to clipboardprint?
PackageManager pManager = MessageSendActivity.this.getPackageManager();  
  
/*********************查询手机内所有支持分享的应用*********************/  
List<ResolveInfo> resolveList  = Utils.getShareApps(MessageSendActivity.this);  
  
for(int i=0;i<resolveList.size();i++) {  
    ResolveInfo resolve = resolveList.get(i);  
    ShareItemInfo shareItem = new ShareItemInfo();  //自定义的类  
    //set Icon  
 shareItem.setIcon(resolve.loadIcon(pManager));  
    //set Application Name  
    shareItem.setLabel(resolve.loadLabel(pManager).toString());  
    //set Package Name   
    shareItem.setPackageName(resolve.activityInfo.packageName);        
}  
4 应用程序使用权限获取方法:
packageManager.getPackageInfo(packageName,PackageManager.GET_PERMISSIONS).requestedPermissions
5 调用系统程序设置界面
1) 2.3以上系统
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);  
Uri uri = Uri.fromParts(SCHEME, packageName, null);  
intent.setData(uri);  
startActivity(intent);  
2) 2.2、2.1版本
private void startApplicationDetailsActivity() {  
    Intent i = new Intent(Intent.ACTION_VIEW);                  
    i.setClassName("com.android.settings","com.android.settings.InstalledAppDetails");  
    i.putExtra(APP_PKG_NAME, packageName);   
    startActivity(i); 
}  
但是常量APP_PKG_NAME的定义并不相同。
2.2中定义为"pkg",2.1中定义为"com.android.settings.ApplicationPkgName"
3) 通用的代码如下:
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);  
}  
6 获取未安装的apk图标
http://blog.csdn.net/sodino/archive/2011/03/01/6215224.aspx
7 监听Android应用程序是否卸载成功
http://hi.baidu.com/luodaijun/blog/item/0887a8c37e9dfc58b219a808.html
8 安装apk
   Intent intent = new Intent(Intent.ACTION_VIEW); 
   intent.setDataAndType(Uri.fromFile(new File("/sdcard/1.apk")), "application/vnd.android.package-archive"); 
   startActivity(intent); 
9  运行应用
   首先android有一个PackageManager,这玩意功能很强大,功能就和它的意思一样
   
   假设:如果我们知道一个第三方Application的包的名称和Activity的名称,是否可以启动它的,答案当让市YES
   
   启动代码:
   PackageManager pm;  
   //初始化pm, 比如在activity里可以PackageManager pm = getPackageManager(); 
   PackageInfo pi = pm.getPackageInfo("包的名称", PackageManager.GET_ACTIVITIES);
   //PackageInfo  包含丰富的包的信息,这个'包的名称'是什么,在AndroidManifest.xml中有明确定义 
   //  比如 package="xxx.yyy.Portal.UI"
   ActivityInfo ai=pi.activities[0];  // ActivityInfo 同样道理 他是 Activity的信息
   //这里指向第一个包中的Activity, 大多数都是第一个Activity为启动Activity
   if(ai==null) throw new Exception(pkg+"不包含任何Activity");
   String sName=ai.name;  //这里就得到Activity的类名了
   启动它:
   Intent intent = new Intent();
   intent.setComponent(new ComponentName(pkg,sName));
   parent.startActivity(intent);
10  获得第三方应用的包名
     
   只要有包名,就可以启动Activity了,但是不知道名字怎么办?
   如果应用没有安装自然启动不了,只要安装了就有办法。
   方法1 :
        MyBroadcastReceiver myReceiver = new MyBroadcastReceiver();
        IntentFilter filter = new IntentFilter(Intent.ACTION_PACKAGE_INSTALL);
        filter.addAction(Intent.ACTION_PACKAGE_ADDED);
        filter.addDataScheme("package"); 
        registerReceiver(myReceiver, filter);
        
      监视安装,在MyBroadcastReceiver的onReceive函数里
      public void onReceive(Context arg0, Intent intent) {
                        String sPackageName=intent.getDataString();  //这个就是包名
                }
      也可以使用 AndroidManifest.xml配置来监视
   方法2 : 
      枚举所有安装的应用,根据你自己的条件筛选
      使用PackageManager的
      public abstract List<PackageInfo> getInstalledPackages (int flags) 可以获得安装应用的列表
 posted on 2011-03-17 15:19  清水湾  阅读(7897)  评论(0编辑  收藏  举报