本節內容是如何獲取Android系統中應用程序的信息,主要包括packagename、label、icon、占用大小等。具體分為兩個
 ?部分,計劃如下:
 ??????????? 第一部分: 獲取應用程序的packagename、label、icon等 ;
 ?????????? ?第二部分: 獲取應用程序的占用大小,包括:緩存大小(cachsize)、數據大小(datasize)。
 ?
 ??? ?? 每部分都為您準備了簡單豐富的實例,您一定不會錯過。
 ?
 ????? Android系統為我們提供了很多服務管理的類,包括ActivityManager、PowerManager(電源管理)、AudioManager(音頻管理)
 等。除此之外,還提供了一個PackageManger管理類,它的主要職責是管理應用程序包。 通過它,我們就可以獲取應用程序信息。
 ?
 ???? 引入: AnroidManifest.xml文件節點說明:
 ???? 
 一、相關類的介紹
 ?
 ????PackageItemInfo類
 ????? ????說明: AndroidManifest.xml文件中所有節點的基類,提供了這些節點的基本信息:a label、icon、 meta-data。它并不
 ?????直接使用,而是由子類繼承然后調用相應方法。
 ????????? 常用字段:
 ????????????? ?public int icon ????????? 獲得該資源圖片在R文件中的值 (對應于android:icon屬性)
 ????????????? ?public int labelRes???? 獲得該label在R文件中的值(對應于android:label屬性)
 ?????????????? public String name?? 獲得該節點的name值?(對應于android:name屬性)
 ?????????????? public?String packagename?? 獲得該應用程序的包名?(對應于android:packagename屬性)
 ????????常用方法:
 ????????????? Drawable? loadIcon(PackageManager pm)????????????? ?獲得當前應用程序的圖像
 ????????????? CharSequence? loadLabel(PackageManager pm)???? 獲得當前應用程序的label
 ?
 ???ActivityInfo類? 繼承自 PackageItemInfo
 ??????????說明: 獲得應用程序中<activity/>或者 <receiver />節點的信息 。我們可以通過它來獲取我們設置的任何屬性,包括
 ????? theme 、launchMode、launchmode等
 ????????????常用方法繼承至PackageItemInfo類中的loadIcon()和loadLabel()?
 ?
 ?? ServiceInfo 類
 ????????? 說明: 同ActivityInfo類似 ,同樣繼承自 PackageItemInfo,只不過它表示的是<service>節點信息。
 ?
 ? ?ApplicationInfo類 繼承自? PackageItemInfo
 ??????? ?說明:獲取一個特定引用程序中<application>節點的信息。
 ???????? 字段說明:
    ? ?flags字段: FLAG_SYSTEM 系統應用程序
      ??????????? ? FLAG_EXTERNAL_STORAGE 表示該應用安裝在sdcard中
 ??????? ?常用方法繼承至PackageItemInfo類中的loadIcon()和loadLabel()
 ?
 ? ResolveInfo類
 ??????? 說明:根據<intent>節點來獲取其上一層目錄的信息,通常是<activity>、<receiver>、<service>節點信息。
 ???????常用字段:
 ???????????? public? ActivityInfo? activityInfo???? 獲取 ActivityInfo對象,即<activity>或<receiver >節點信息
 ??????????? ?public ServiceInfo?? serviceInfo??? ?獲取 ServiceInfo對象,即<service>節點信息
 ???? ? 常用方法:?
 ??????????? ?Drawable loadIcon(PackageManager pm)??????????? ?獲得當前應用程序的圖像
 ??????????? ?CharSequence loadLabel(PackageManager pm)??獲得當前應用程序的label
 ?
 ?PackageInfo類
 ????? ?說明:手動獲取AndroidManifest.xml文件的信息 。
 ???????常用字段:
 ?????????? public String??? packageName????????????????? ?包名
 ???????????public ActivityInfo[]???? activities?? ?????????????? ?所有<activity>節點信息
 ?????????? public ApplicationInfo applicationInfo???????<application>節點信息,只有一個
 ???????????public ActivityInfo[]?? ?receivers???????????? ??? ?所有<receiver>節點信息,多個
 ?????????? public ServiceInfo[]??? services?????????????? ?? 所有<service>節點信息 ,多個
 ?
 PackageManger 類
 ????? 說明: 獲得已安裝的應用程序信息 。可以通過getPackageManager()方法獲得。
 ????? 常用方法:
 ??????????public abstract PackageManager? getPackageManager()???
 ???????????????功能:獲得一個PackageManger對象
 ?????? ??public abstrac? tDrawable??? getApplicationIcon(StringpackageName)
 ???????????????參數: packageName 包名
 ???????????????功能:返回給定包名的圖標,否則返回null
 ?
 ???????public abstract ApplicationInfo???getApplicationInfo(String packageName, int flags)
 ?
 ???????????????參數:packagename 包名
 ?????????????????????? ? ??flags 該ApplicationInfo是此flags標記,通常可以直接賦予常數0即可
 ???????????????功能:返回該ApplicationInfo對象
 ?
 ????????? public abstract?List<ApplicationInfo>? getInstalledApplications(int flags) 
 ?????????????? 參數:flag為一般為GET_UNINSTALLED_PACKAGES,那么此時會返回所有ApplicationInfo。我們可以對ApplicationInfo
 ???????????????????? 的flags過濾,得到我們需要的。
 ?????????????? 功能:返回給定條件的所有PackageInfo
 ?
 ??????? ??public abstract?List<PackageInfo>? getInstalledPackages(int flags)? 
 ???????????? 參數如上
 ???? ?????? ?功能:返回給定條件的所有PackageInfo
 ?
 ???????public abstractResolveInfo? resolveActivity(Intent intent, int flags)
 ??????????? 參數:? intent?查尋條件,Activity所配置的action和category
 ???????????????????????? ?flags:?MATCH_DEFAULT_ONLY?? ?:Category必須帶有CATEGORY_DEFAULT的Activity,才匹配
 ???????????????????????????????????? ?GET_INTENT_FILTERS?????? ? :匹配Intent條件即可
 ??????????????????????????????????????????????????GET_RESOLVED_FILTER????:匹配Intent條件即可
 ??????????? 功能 :返回給定條件的ResolveInfo對象(本質上是Activity)?
 ?
 ???????public abstract??List<ResolveInfo>? queryIntentActivities(Intent intent, int flags) 
 ??????????? 參數同上
 ????????????功能 :返回給定條件的所有ResolveInfo對象(本質上是Activity),集合對象
 ?
 ??????public abstract ResolveInfo? resolveService(Intent intent, int flags)
 ?????????? 參數同上
 ???????????功能 :返回給定條件的ResolveInfo對象(本質上是Service)
 ?
 ?????public abstract List<ResolveInfo>?queryIntentServices(Intent intent, int flags)
 ????????? 參數同上
 ??????????功能 :返回給定條件的所有ResolveInfo對象(本質上是Service),集合對象
 ?
 二、DEMO講解
 ?
 ??????????? 通過前面的介紹,相信您一定很了解了,本質上來講,這些XXXInfo類不過是我們在AndroidManifest.XML文件中定義的信息,
 知道到這點了,理解起來就不是很難了。
 ??????? ?下面我透過兩個簡答的DEMO,來學以致用。
 ?????????? Demo 1: 通過queryIntentActivities()方法,查詢Android系統的所有具備ACTION_MAIN和CATEGORY_LAUNCHER
 ????? 的Intent的應用程序,點擊后,能啟動該應用,說白了就是做一個類似Home程序的簡易Launcher 。
 ???????? ? Demo 2 :通過getInstalledApplications()方法獲取應用,然后對其過濾,查找出我們需要的第三方應用,系統應用,安裝在sdcard的應用。
 ?
 ? ??? Demo1? :
 ?????????圖:
 ??????????? ?? 
 ??1 、布局文件: 主要有兩個:帶listview的browse_app_list.xml文件 ;listview的項browse_app_item.xml
 browse_app_list.xml
   [java] view plaincopyprint?  <?xml?version="1.0"?encoding="utf-8"?>??<LinearLayout?xmlns:android="http://schemas.android.com/apk/res/android"??????android:orientation="vertical"?android:layout_width="fill_parent"??????android:layout_height="fill_parent">>??????<ListView?android:id="@+id/listviewApp"?android:layout_width="fill_parent"??????????android:layout_height="fill_parent"?></ListView>??</LinearLayout>?? <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical" android:layout_width="fill_parent"android:layout_height="fill_parent">><ListView android:id="@+id/listviewApp" android:layout_width="fill_parent"android:layout_height="fill_parent" ></ListView>
</LinearLayout>
 browse_app_item.xmlbrowse_app_item.xml
   [java] view plaincopyprint?  <?xml?version="1.0"?encoding="utf-8"?>??<LinearLayout?xmlns:android="http://schemas.android.com/apk/res/android"??????android:layout_width="fill_parent"?android:layout_height="50dip">????????<ImageView?android:id="@+id/imgApp"?android:layout_width="wrap_content"??????????android:layout_height="fill_parent"?></ImageView>??????<RelativeLayout?android:layout_width="fill_parent"??android:layout_marginLeft="10dip"??????????android:layout_height="40dip">??????????<TextView?android:id="@+id/tvLabel"?android:layout_width="wrap_content"??????????????android:layout_height="wrap_content"?android:text="AppLable?:?"></TextView>??????????<TextView?android:id="@+id/tvAppLabel"?android:layout_width="wrap_content"??????????????android:layout_toRightOf="@id/tvLabel"?android:layout_height="wrap_content"??????????????android:layout_marginLeft="3dip"?android:text="Label"?android:textColor="#FFD700"></TextView>??????????<TextView?android:id="@+id/tvName"?android:layout_width="wrap_content"??????????????android:layout_height="wrap_content"?android:layout_below="@id/tvLabel"???????????????android:text="包名:"></TextView>??????????<TextView?android:id="@+id/tvPkgName"?android:layout_width="wrap_content"??????????????android:layout_height="wrap_content"?android:layout_below="@id/tvAppLabel"??????????????android:layout_alignLeft="@id/tvAppLabel"?android:textColor="#FFD700"></TextView>??????</RelativeLayout>??</LinearLayout>?? <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="fill_parent" android:layout_height="50dip"><ImageView android:id="@+id/imgApp" android:layout_width="wrap_content"android:layout_height="fill_parent" ></ImageView><RelativeLayout android:layout_width="fill_parent"  android:layout_marginLeft="10dip"android:layout_height="40dip"><TextView android:id="@+id/tvLabel" android:layout_width="wrap_content"android:layout_height="wrap_content" android:text="AppLable : "></TextView><TextView android:id="@+id/tvAppLabel" android:layout_width="wrap_content"android:layout_toRightOf="@id/tvLabel" android:layout_height="wrap_content"android:layout_marginLeft="3dip" android:text="Label" android:textColor="#FFD700"></TextView><TextView android:id="@+id/tvName" android:layout_width="wrap_content"android:layout_height="wrap_content" android:layout_below="@id/tvLabel" android:text="包名:"></TextView><TextView android:id="@+id/tvPkgName" android:layout_width="wrap_content"android:layout_height="wrap_content" android:layout_below="@id/tvAppLabel"android:layout_alignLeft="@id/tvAppLabel" android:textColor="#FFD700"></TextView></RelativeLayout>
</LinearLayout>
 ???????
 2 、AppInfo.java : 保存應用程序信息的Model類
   [java] view plaincopyprint?  /Model類?,用來存儲應用程序信息??public?class?AppInfo?{??????????private?String?appLabel;??????????private?Drawable?appIcon?;????????private?Intent?intent?;???????????private?String?pkgName?;????????????????public?AppInfo(){}????????????public?String?getAppLabel()?{??????????return?appLabel;??????}??????public?void?setAppLabel(String?appName)?{??????????this.appLabel?=?appName;??????}??????public?Drawable?getAppIcon()?{??????????return?appIcon;??????}??????public?void?setAppIcon(Drawable?appIcon)?{??????????this.appIcon?=?appIcon;??????}??????public?Intent?getIntent()?{??????????return?intent;??????}??????public?void?setIntent(Intent?intent)?{??????????this.intent?=?intent;??????}??????public?String?getPkgName(){??????????return?pkgName?;??????}??????public?void?setPkgName(String?pkgName){??????????this.pkgName=pkgName?;??????}??}?? /Model類 ,用來存儲應用程序信息
public class AppInfo {private String appLabel;    //應用程序標簽private Drawable appIcon ;  //應用程序圖像private Intent intent ;     //啟動應用程序的Intent ,一般是Action為Main和Category為Lancher的Activityprivate String pkgName ;    //應用程序所對應的包名public AppInfo(){}public String getAppLabel() {return appLabel;}public void setAppLabel(String appName) {this.appLabel = appName;}public Drawable getAppIcon() {return appIcon;}public void setAppIcon(Drawable appIcon) {this.appIcon = appIcon;}public Intent getIntent() {return intent;}public void setIntent(Intent intent) {this.intent = intent;}public String getPkgName(){return pkgName ;}public void setPkgName(String pkgName){this.pkgName=pkgName ;}
}
 ?3、 BrowseApplicationInfoAdapter.java : 自定義適配器類,為ListView提供視圖
   [java] view plaincopyprint?  ??public?class?BrowseApplicationInfoAdapter?extends?BaseAdapter?{????????????private?List<AppInfo>?mlistAppInfo?=?null;????????????LayoutInflater?infater?=?null;????????????public?BrowseApplicationInfoAdapter(Context?context,??List<AppInfo>?apps)?{??????????infater?=?(LayoutInflater)?context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);??????????mlistAppInfo?=?apps?;??????}??????@Override??????public?int?getCount()?{????????????????????System.out.println("size"?+?mlistAppInfo.size());??????????return?mlistAppInfo.size();??????}??????@Override??????public?Object?getItem(int?position)?{????????????????????return?mlistAppInfo.get(position);??????}??????@Override??????public?long?getItemId(int?position)?{????????????????????return?0;??????}??????@Override??????public?View?getView(int?position,?View?convertview,?ViewGroup?arg2)?{??????????System.out.println("getView?at?"?+?position);??????????View?view?=?null;??????????ViewHolder?holder?=?null;??????????if?(convertview?==?null?||?convertview.getTag()?==?null)?{??????????????view?=?infater.inflate(R.layout.browse_app_item,?null);??????????????holder?=?new?ViewHolder(view);??????????????view.setTag(holder);??????????}???????????else{??????????????view?=?convertview?;??????????????holder?=?(ViewHolder)?convertview.getTag()?;??????????}??????????AppInfo?appInfo?=?(AppInfo)?getItem(position);??????????holder.appIcon.setImageDrawable(appInfo.getAppIcon());??????????holder.tvAppLabel.setText(appInfo.getAppLabel());??????????holder.tvPkgName.setText(appInfo.getPkgName());??????????return?view;??????}????????class?ViewHolder?{??????????ImageView?appIcon;??????????TextView?tvAppLabel;??????????TextView?tvPkgName;????????????public?ViewHolder(View?view)?{??????????????this.appIcon?=?(ImageView)?view.findViewById(R.id.imgApp);??????????????this.tvAppLabel?=?(TextView)?view.findViewById(R.id.tvAppLabel);??????????????this.tvPkgName?=?(TextView)?view.findViewById(R.id.tvPkgName);??????????}??????}??}?? //自定義適配器類,提供給listView的自定義view
public class BrowseApplicationInfoAdapter extends BaseAdapter {private List<AppInfo> mlistAppInfo = null;LayoutInflater infater = null;public BrowseApplicationInfoAdapter(Context context,  List<AppInfo> apps) {infater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);mlistAppInfo = apps ;}@Overridepublic int getCount() {// TODO Auto-generated method stubSystem.out.println("size" + mlistAppInfo.size());return mlistAppInfo.size();}@Overridepublic Object getItem(int position) {// TODO Auto-generated method stubreturn mlistAppInfo.get(position);}@Overridepublic long getItemId(int position) {// TODO Auto-generated method stubreturn 0;}@Overridepublic View getView(int position, View convertview, ViewGroup arg2) {System.out.println("getView at " + position);View view = null;ViewHolder holder = null;if (convertview == null || convertview.getTag() == null) {view = infater.inflate(R.layout.browse_app_item, null);holder = new ViewHolder(view);view.setTag(holder);} else{view = convertview ;holder = (ViewHolder) convertview.getTag() ;}AppInfo appInfo = (AppInfo) getItem(position);holder.appIcon.setImageDrawable(appInfo.getAppIcon());holder.tvAppLabel.setText(appInfo.getAppLabel());holder.tvPkgName.setText(appInfo.getPkgName());return view;}class ViewHolder {ImageView appIcon;TextView tvAppLabel;TextView tvPkgName;public ViewHolder(View view) {this.appIcon = (ImageView) view.findViewById(R.id.imgApp);this.tvAppLabel = (TextView) view.findViewById(R.id.tvAppLabel);this.tvPkgName = (TextView) view.findViewById(R.id.tvPkgName);}}
} ?
 4 、MainActivity.java 主工程邏輯? 
 ????????? 請仔細體會queryIntentActivities()方法,并且注意到排序,它很重要。
   [java] view plaincopyprint?  <span?style="font-size:?13px;">public?class?MainActivity?extends?Activity?implements?OnItemClickListener?{????????private?ListView?listview?=?null;????????private?List<AppInfo>?mlistAppInfo?=?null;????????@Override??????public?void?onCreate(Bundle?savedInstanceState)?{??????????super.onCreate(savedInstanceState);??????????setContentView(R.layout.browse_app_list);????????????listview?=?(ListView)?findViewById(R.id.listviewApp);??????????mlistAppInfo?=?new?ArrayList<AppInfo>();??????????queryAppInfo();???????????BrowseApplicationInfoAdapter?browseAppAdapter?=?new?BrowseApplicationInfoAdapter(??????????????????this,?mlistAppInfo);??????????listview.setAdapter(browseAppAdapter);??????????listview.setOnItemClickListener(this);??????}????????????public?void?onItemClick(AdapterView<?>?arg0,?View?view,?int?position,??????????????long?arg3)?{????????????????????Intent?intent?=?mlistAppInfo.get(position).getIntent();??????????startActivity(intent);??????}????????????public?void?queryAppInfo()?{??????????PackageManager?pm?=?this.getPackageManager();???????????Intent?mainIntent?=?new?Intent(Intent.ACTION_MAIN,?null);??????????mainIntent.addCategory(Intent.CATEGORY_LAUNCHER);????????????????????List<ResolveInfo>?resolveInfos?=?pm??????????????????.queryIntentActivities(mainIntent,?PackageManager.MATCH_DEFAULT_ONLY);??????????????????????????????Collections.sort(resolveInfos,new?ResolveInfo.DisplayNameComparator(pm));??????????if?(mlistAppInfo?!=?null)?{??????????????mlistAppInfo.clear();??????????????for?(ResolveInfo?reInfo?:?resolveInfos)?{??????????????????String?activityName?=?reInfo.activityInfo.name;???????????????????String?pkgName?=?reInfo.activityInfo.packageName;???????????????????String?appLabel?=?(String)?reInfo.loadLabel(pm);???????????????????Drawable?icon?=?reInfo.loadIcon(pm);?????????????????????????????????????Intent?launchIntent?=?new?Intent();??????????????????launchIntent.setComponent(new?ComponentName(pkgName,??????????????????????????activityName));????????????????????????????????????AppInfo?appInfo?=?new?AppInfo();??????????????????appInfo.setAppLabel(appLabel);??????????????????appInfo.setPkgName(pkgName);??????????????????appInfo.setAppIcon(icon);??????????????????appInfo.setIntent(launchIntent);??????????????????mlistAppInfo.add(appInfo);???????????????????System.out.println(appLabel?+?"?activityName---"?+?activityName??????????????????????????+?"?pkgName---"?+?pkgName);??????????????}??????????}??????}??}</span>?? public class MainActivity extends Activity implements OnItemClickListener {private ListView listview = null;private List<AppInfo> mlistAppInfo = null;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.browse_app_list);listview = (ListView) findViewById(R.id.listviewApp);mlistAppInfo = new ArrayList<AppInfo>();queryAppInfo(); // 查詢所有應用程序信息BrowseApplicationInfoAdapter browseAppAdapter = new BrowseApplicationInfoAdapter(this, mlistAppInfo);listview.setAdapter(browseAppAdapter);listview.setOnItemClickListener(this);}// 點擊跳轉至該應用程序public void onItemClick(AdapterView<?> arg0, View view, int position,long arg3) {// TODO Auto-generated method stubIntent intent = mlistAppInfo.get(position).getIntent();startActivity(intent);}// 獲得所有啟動Activity的信息,類似于Launch界面public void queryAppInfo() {PackageManager pm = this.getPackageManager(); // 獲得PackageManager對象Intent mainIntent = new Intent(Intent.ACTION_MAIN, null);mainIntent.addCategory(Intent.CATEGORY_LAUNCHER);// 通過查詢,獲得所有ResolveInfo對象.List<ResolveInfo> resolveInfos = pm.queryIntentActivities(mainIntent, PackageManager.MATCH_DEFAULT_ONLY);// 調用系統排序 , 根據name排序// 該排序很重要,否則只能顯示系統應用,而不能列出第三方應用程序Collections.sort(resolveInfos,new ResolveInfo.DisplayNameComparator(pm));if (mlistAppInfo != null) {mlistAppInfo.clear();for (ResolveInfo reInfo : resolveInfos) {String activityName = reInfo.activityInfo.name; // 獲得該應用程序的啟動Activity的nameString pkgName = reInfo.activityInfo.packageName; // 獲得應用程序的包名String appLabel = (String) reInfo.loadLabel(pm); // 獲得應用程序的LabelDrawable icon = reInfo.loadIcon(pm); // 獲得應用程序圖標// 為應用程序的啟動Activity 準備IntentIntent launchIntent = new Intent();launchIntent.setComponent(new ComponentName(pkgName,activityName));// 創建一個AppInfo對象,并賦值AppInfo appInfo = new AppInfo();appInfo.setAppLabel(appLabel);appInfo.setPkgName(pkgName);appInfo.setAppIcon(icon);appInfo.setIntent(launchIntent);mlistAppInfo.add(appInfo); // 添加至列表中System.out.println(appLabel + " activityName---" + activityName+ " pkgName---" + pkgName);}}}
} ?好了,第一個Demo完成 。。? 
 ?
 ?Demo 2:
 ?????? ?demo2在布局、適配器方面和Demo1一樣。只是利用了getInstalledApplications()方法,繼而通過ApplicationInfo.flags來挑選
 ? 我們希望的ApplicationInfo對象。
 ?????? 圖:
 ????????????? ?????????
 ?
 ?過濾應用程序如下:
   [java] view plaincopyprint?  package?com.qiner.appinfo;????import?java.util.ArrayList;??import?java.util.Collections;??import?java.util.List;????import?com.qiner.appinfo.R;????import?android.app.Activity;??import?android.app.Application;??import?android.content.pm.ApplicationInfo;??import?android.content.pm.PackageManager;??import?android.os.Bundle;??import?android.view.View;??import?android.view.View.OnClickListener;??import?android.widget.Button;??import?android.widget.ListView;????public?class?MainActivity?extends?Activity??{????????public?static?final?int?FILTER_ALL_APP?=?0;???????public?static?final?int?FILTER_SYSTEM_APP?=?1;???????public?static?final?int?FILTER_THIRD_APP?=?2;???????public?static?final?int?FILTER_SDCARD_APP?=?3;?????????private?ListView?listview?=?null;????????private?PackageManager?pm;??????private?int?filter?=?FILTER_ALL_APP;???????private?List<AppInfo>?mlistAppInfo?;??????private?BrowseApplicationInfoAdapter?browseAppAdapter?=?null?;????????????@Override??????public?void?onCreate(Bundle?savedInstanceState)?{??????????super.onCreate(savedInstanceState);??????????setContentView(R.layout.browse_app_list);??????????listview?=?(ListView)?findViewById(R.id.listviewApp);??????????if(getIntent()!=null){??????????????filter?=?getIntent().getIntExtra("filter",?0)?;??????????}??????????mlistAppInfo?=?queryFilterAppInfo(filter);?????????????????????browseAppAdapter?=?new?BrowseApplicationInfoAdapter(this,?mlistAppInfo);??????????listview.setAdapter(browseAppAdapter);??????}????????????private?List<AppInfo>?queryFilterAppInfo(int?filter)?{??????????pm?=?this.getPackageManager();????????????????????List<ApplicationInfo>?listAppcations?=?pm??????????????????.getInstalledApplications(PackageManager.GET_UNINSTALLED_PACKAGES);??????????Collections.sort(listAppcations,??????????????????new?ApplicationInfo.DisplayNameComparator(pm));??????????List<AppInfo>?appInfos?=?new?ArrayList<AppInfo>();?????????????????????switch?(filter)?{??????????case?FILTER_ALL_APP:???????????????appInfos.clear();??????????????for?(ApplicationInfo?app?:?listAppcations)?{??????????????????appInfos.add(getAppInfo(app));??????????????}??????????????return?appInfos;??????????case?FILTER_SYSTEM_APP:???????????????appInfos.clear();??????????????for?(ApplicationInfo?app?:?listAppcations)?{??????????????????if?((app.flags?&?ApplicationInfo.FLAG_SYSTEM)?!=?0)?{??????????????????????appInfos.add(getAppInfo(app));??????????????????}??????????????}??????????????return?appInfos;??????????case?FILTER_THIRD_APP:???????????????appInfos.clear();??????????????for?(ApplicationInfo?app?:?listAppcations)?{????????????????????????????????????if?((app.flags?&?ApplicationInfo.FLAG_SYSTEM)?<=?0)?{??????????????????????appInfos.add(getAppInfo(app));??????????????????}?????????????????????????????????????else?if?((app.flags?&?ApplicationInfo.FLAG_UPDATED_SYSTEM_APP)?!=?0){??????????????????????appInfos.add(getAppInfo(app));??????????????????}??????????????}??????????????break;??????????case?FILTER_SDCARD_APP:???????????????appInfos.clear();??????????????for?(ApplicationInfo?app?:?listAppcations)?{??????????????????if?((app.flags?&?ApplicationInfo.FLAG_EXTERNAL_STORAGE)?!=?0)?{??????????????????????appInfos.add(getAppInfo(app));??????????????????}??????????????}??????????????return?appInfos;??????????default:??????????????return?null;??????????}??????????return?appInfos;??????}????????????private?AppInfo?getAppInfo(ApplicationInfo?app)?{??????????AppInfo?appInfo?=?new?AppInfo();??????????appInfo.setAppLabel((String)?app.loadLabel(pm));??????????appInfo.setAppIcon(app.loadIcon(pm));??????????appInfo.setPkgName(app.packageName);??????????return?appInfo;??????}??}?? package com.qiner.appinfo;import java.util.ArrayList;
import java.util.Collections;
import java.util.List;import com.qiner.appinfo.R;import android.app.Activity;
import android.app.Application;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ListView;public class MainActivity extends Activity  {public static final int FILTER_ALL_APP = 0; // 所有應用程序public static final int FILTER_SYSTEM_APP = 1; // 系統程序public static final int FILTER_THIRD_APP = 2; // 第三方應用程序public static final int FILTER_SDCARD_APP = 3; // 安裝在SDCard的應用程序private ListView listview = null;private PackageManager pm;private int filter = FILTER_ALL_APP; private List<AppInfo> mlistAppInfo ;private BrowseApplicationInfoAdapter browseAppAdapter = null ;/** Called when the activity is first created. */@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.browse_app_list);listview = (ListView) findViewById(R.id.listviewApp);if(getIntent()!=null){filter = getIntent().getIntExtra("filter", 0) ;}mlistAppInfo = queryFilterAppInfo(filter); // 查詢所有應用程序信息// 構建適配器,并且注冊到listViewbrowseAppAdapter = new BrowseApplicationInfoAdapter(this, mlistAppInfo);listview.setAdapter(browseAppAdapter);}// 根據查詢條件,查詢特定的ApplicationInfoprivate List<AppInfo> queryFilterAppInfo(int filter) {pm = this.getPackageManager();// 查詢所有已經安裝的應用程序List<ApplicationInfo> listAppcations = pm.getInstalledApplications(PackageManager.GET_UNINSTALLED_PACKAGES);Collections.sort(listAppcations,new ApplicationInfo.DisplayNameComparator(pm));// 排序List<AppInfo> appInfos = new ArrayList<AppInfo>(); // 保存過濾查到的AppInfo// 根據條件來過濾switch (filter) {case FILTER_ALL_APP: // 所有應用程序appInfos.clear();for (ApplicationInfo app : listAppcations) {appInfos.add(getAppInfo(app));}return appInfos;case FILTER_SYSTEM_APP: // 系統程序appInfos.clear();for (ApplicationInfo app : listAppcations) {if ((app.flags & ApplicationInfo.FLAG_SYSTEM) != 0) {appInfos.add(getAppInfo(app));}}return appInfos;case FILTER_THIRD_APP: // 第三方應用程序appInfos.clear();for (ApplicationInfo app : listAppcations) {//非系統程序if ((app.flags & ApplicationInfo.FLAG_SYSTEM) <= 0) {appInfos.add(getAppInfo(app));} //本來是系統程序,被用戶手動更新后,該系統程序也成為第三方應用程序了else if ((app.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0){appInfos.add(getAppInfo(app));}}break;case FILTER_SDCARD_APP: // 安裝在SDCard的應用程序appInfos.clear();for (ApplicationInfo app : listAppcations) {if ((app.flags & ApplicationInfo.FLAG_EXTERNAL_STORAGE) != 0) {appInfos.add(getAppInfo(app));}}return appInfos;default:return null;}return appInfos;}// 構造一個AppInfo對象 ,并賦值private AppInfo getAppInfo(ApplicationInfo app) {AppInfo appInfo = new AppInfo();appInfo.setAppLabel((String) app.loadLabel(pm));appInfo.setAppIcon(app.loadIcon(pm));appInfo.setPkgName(app.packageName);return appInfo;}
} ????你可以在此基礎上,構建更多豐富的應用。比說說Settings模塊中的卸載安裝應用程序等。?
 ?
 ?
 ??? 本節的源代碼已上傳,下載地址:http://download.csdn.net/detail/qinjuning/3775869
                            總結
                            
                                以上是生活随笔為你收集整理的Android中获取应用程序(包)的信息-----PackageManager的使用(一)的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                            
                                如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。