日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android中获取应用程序(包)的信息-----PackageManager的使用(一)

發(fā)布時間:2023/11/29 Android 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android中获取应用程序(包)的信息-----PackageManager的使用(一) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

本節(jié)內(nèi)容是如何獲取Android系統(tǒng)中應(yīng)用程序的信息,主要包括packagename、label、icon、占用大小等。具體分為兩個

?部分,計劃如下:

??????????? 第一部分: 獲取應(yīng)用程序的packagename、label、icon等 ;

?????????? ?第二部分: 獲取應(yīng)用程序的占用大小,包括:緩存大小(cachsize)、數(shù)據(jù)大小(datasize)。

?

??? ?? 每部分都為您準(zhǔn)備了簡單豐富的實例,您一定不會錯過。

?

????? Android系統(tǒng)為我們提供了很多服務(wù)管理的類,包括ActivityManager、PowerManager(電源管理)、AudioManager(音頻管理)

等。除此之外,還提供了一個PackageManger管理類,它的主要職責(zé)是管理應(yīng)用程序包。 通過它,我們就可以獲取應(yīng)用程序信息。

?

???? 引入: AnroidManifest.xml文件節(jié)點說明:

????

一、相關(guān)類的介紹

?

????PackageItemInfo類

????? ????說明: AndroidManifest.xml文件中所有節(jié)點的基類,提供了這些節(jié)點的基本信息:a label、icon、 meta-data。它并不

?????直接使用,而是由子類繼承然后調(diào)用相應(yīng)方法。

????????? 常用字段

????????????? ?public int icon ????????? 獲得該資源圖片在R文件中的值 (對應(yīng)于android:icon屬性)

????????????? ?public int labelRes???? 獲得該label在R文件中的值(對應(yīng)于android:label屬性)

?????????????? public String name?? 獲得該節(jié)點的name值?(對應(yīng)于android:name屬性)

?????????????? public?String packagename?? 獲得該應(yīng)用程序的包名?(對應(yīng)于android:packagename屬性)

????????常用方法

????????????? Drawable? loadIcon(PackageManager pm)????????????? ?獲得當(dāng)前應(yīng)用程序的圖像

????????????? CharSequence? loadLabel(PackageManager pm)???? 獲得當(dāng)前應(yīng)用程序的label

?

???ActivityInfo類? 繼承自 PackageItemInfo

??????????說明: 獲得應(yīng)用程序中<activity/>或者 <receiver />節(jié)點的信息 。我們可以通過它來獲取我們設(shè)置的任何屬性,包括

????? theme 、launchMode、launchmode等

????????????常用方法繼承至PackageItemInfo類中的loadIcon()和loadLabel()?

?

?? ServiceInfo 類

????????? 說明: 同ActivityInfo類似 ,同樣繼承自 PackageItemInfo,只不過它表示的是<service>節(jié)點信息。

?

? ?ApplicationInfo類 繼承自? PackageItemInfo

??????? ?說明:獲取一個特定引用程序中<application>節(jié)點的信息。

???????? 字段說明

   ? ?flags字段: FLAG_SYSTEM 系統(tǒng)應(yīng)用程序

     ??????????? ? FLAG_EXTERNAL_STORAGE 表示該應(yīng)用安裝在sdcard中

??????? ?常用方法繼承至PackageItemInfo類中的loadIcon()和loadLabel()

?

? ResolveInfo類

??????? 說明:根據(jù)<intent>節(jié)點來獲取其上一層目錄的信息,通常是<activity>、<receiver>、<service>節(jié)點信息。

???????常用字段

???????????? public? ActivityInfo? activityInfo???? 獲取 ActivityInfo對象,即<activity>或<receiver >節(jié)點信息

??????????? ?public ServiceInfo?? serviceInfo??? ?獲取 ServiceInfo對象,即<service>節(jié)點信息

???? ? 常用方法:?

??????????? ?Drawable loadIcon(PackageManager pm)??????????? ?獲得當(dāng)前應(yīng)用程序的圖像

??????????? ?CharSequence loadLabel(PackageManager pm)??獲得當(dāng)前應(yīng)用程序的label

?

?PackageInfo類

????? ?說明:手動獲取AndroidManifest.xml文件的信息 。

???????常用字段

?????????? public String??? packageName????????????????? ?包名

???????????public ActivityInfo[]???? activities?? ?????????????? ?所有<activity>節(jié)點信息

?????????? public ApplicationInfo applicationInfo???????<application>節(jié)點信息,只有一個

???????????public ActivityInfo[]?? ?receivers???????????? ??? ?所有<receiver>節(jié)點信息,多個

?????????? public ServiceInfo[]??? services?????????????? ?? 所有<service>節(jié)點信息 ,多個

?

PackageManger 類

????? 說明: 獲得已安裝的應(yīng)用程序信息 。可以通過getPackageManager()方法獲得。

????? 常用方法

??????????public abstract PackageManager? getPackageManager()???

???????????????功能:獲得一個PackageManger對象

?????? ??public abstrac? tDrawable??? getApplicationIcon(StringpackageName)

???????????????參數(shù): packageName 包名

???????????????功能:返回給定包名的圖標(biāo),否則返回null

?

???????public abstract ApplicationInfo???getApplicationInfo(String packageName, int flags)

?

???????????????參數(shù):packagename 包名

?????????????????????? ? ??flags 該ApplicationInfo是此flags標(biāo)記,通常可以直接賦予常數(shù)0即可

???????????????功能:返回該ApplicationInfo對象

?

????????? public abstract?List<ApplicationInfo>? getInstalledApplications(int flags)

?????????????? 參數(shù):flag為一般為GET_UNINSTALLED_PACKAGES,那么此時會返回所有ApplicationInfo。我們可以對ApplicationInfo

???????????????????? 的flags過濾,得到我們需要的。

?????????????? 功能:返回給定條件的所有PackageInfo

?

??????? ??public abstract?List<PackageInfo>? getInstalledPackages(int flags)?

???????????? 參數(shù)如上

???? ?????? ?功能:返回給定條件的所有PackageInfo

?

???????public abstractResolveInfo? resolveActivity(Intent intent, int flags)

??????????? 參數(shù):? intent?查尋條件,Activity所配置的action和category

???????????????????????? ?flags:?MATCH_DEFAULT_ONLY?? ?:Category必須帶有CATEGORY_DEFAULT的Activity,才匹配

???????????????????????????????????? ?GET_INTENT_FILTERS?????? ? :匹配Intent條件即可

??????????????????????????????????????????????????GET_RESOLVED_FILTER????:匹配Intent條件即可

??????????? 功能 :返回給定條件的ResolveInfo對象(本質(zhì)上是Activity)?

?

???????public abstract??List<ResolveInfo>? queryIntentActivities(Intent intent, int flags)

??????????? 參數(shù)同上

????????????功能 :返回給定條件的所有ResolveInfo對象(本質(zhì)上是Activity),集合對象

?

??????public abstract ResolveInfo? resolveService(Intent intent, int flags)

?????????? 參數(shù)同上

???????????功能 :返回給定條件的ResolveInfo對象(本質(zhì)上是Service)

?

?????public abstract List<ResolveInfo>?queryIntentServices(Intent intent, int flags)

????????? 參數(shù)同上

??????????功能 :返回給定條件的所有ResolveInfo對象(本質(zhì)上是Service),集合對象

?

二、DEMO講解

?

??????????? 通過前面的介紹,相信您一定很了解了,本質(zhì)上來講,這些XXXInfo類不過是我們在AndroidManifest.XML文件中定義的信息,

知道到這點了,理解起來就不是很難了。

??????? ?下面我透過兩個簡答的DEMO,來學(xué)以致用。

?????????? Demo 1: 通過queryIntentActivities()方法,查詢Android系統(tǒng)的所有具備ACTION_MAIN和CATEGORY_LAUNCHER

????? 的Intent的應(yīng)用程序,點擊后,能啟動該應(yīng)用,說白了就是做一個類似Home程序的簡易Launcher 。

???????? ? Demo 2 :通過getInstalledApplications()方法獲取應(yīng)用,然后對其過濾,查找出我們需要的第三方應(yīng)用,系統(tǒng)應(yīng)用,安裝在sdcard的應(yīng)用。

?

? ??? 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 : 保存應(yīng)用程序信息的Model類

    [java] view plaincopyprint?
  • /Model類?,用來存儲應(yīng)用程序信息??
  • public?class?AppInfo?{??
  • ????
  • ????private?String?appLabel;????//應(yīng)用程序標(biāo)簽??
  • ????private?Drawable?appIcon?;??//應(yīng)用程序圖像??
  • ????private?Intent?intent?;?????//啟動應(yīng)用程序的Intent?,一般是Action為Main和Category為Lancher的Activity??
  • ????private?String?pkgName?;????//應(yīng)用程序所對應(yīng)的包名??
  • ??????
  • ????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類 ,用來存儲應(yīng)用程序信息 public class AppInfo {private String appLabel; //應(yīng)用程序標(biāo)簽private Drawable appIcon ; //應(yīng)用程序圖像private Intent intent ; //啟動應(yīng)用程序的Intent ,一般是Action為Main和Category為Lancher的Activityprivate String pkgName ; //應(yīng)用程序所對應(yīng)的包名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?
  • //自定義適配器類,提供給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?;??
  • ????}??
  • ????@Override??
  • ????public?int?getCount()?{??
  • ????????//?TODO?Auto-generated?method?stub??
  • ????????System.out.println("size"?+?mlistAppInfo.size());??
  • ????????return?mlistAppInfo.size();??
  • ????}??
  • ????@Override??
  • ????public?Object?getItem(int?position)?{??
  • ????????//?TODO?Auto-generated?method?stub??
  • ????????return?mlistAppInfo.get(position);??
  • ????}??
  • ????@Override??
  • ????public?long?getItemId(int?position)?{??
  • ????????//?TODO?Auto-generated?method?stub??
  • ????????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 主工程邏輯?

    ????????? 請仔細(xì)體會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();?//?查詢所有應(yīng)用程序信息??
  • ????????BrowseApplicationInfoAdapter?browseAppAdapter?=?new?BrowseApplicationInfoAdapter(??
  • ????????????????this,?mlistAppInfo);??
  • ????????listview.setAdapter(browseAppAdapter);??
  • ????????listview.setOnItemClickListener(this);??
  • ????}??
  • ????//?點擊跳轉(zhuǎn)至該應(yīng)用程序??
  • ????public?void?onItemClick(AdapterView<?>?arg0,?View?view,?int?position,??
  • ????????????long?arg3)?{??
  • ????????//?TODO?Auto-generated?method?stub??
  • ????????Intent?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);??
  • ????????//?調(diào)用系統(tǒng)排序?,?根據(jù)name排序??
  • ????????//?該排序很重要,否則只能顯示系統(tǒng)應(yīng)用,而不能列出第三方應(yīng)用程序??
  • ????????Collections.sort(resolveInfos,new?ResolveInfo.DisplayNameComparator(pm));??
  • ????????if?(mlistAppInfo?!=?null)?{??
  • ????????????mlistAppInfo.clear();??
  • ????????????for?(ResolveInfo?reInfo?:?resolveInfos)?{??
  • ????????????????String?activityName?=?reInfo.activityInfo.name;?//?獲得該應(yīng)用程序的啟動Activity的name??
  • ????????????????String?pkgName?=?reInfo.activityInfo.packageName;?//?獲得應(yīng)用程序的包名??
  • ????????????????String?appLabel?=?(String)?reInfo.loadLabel(pm);?//?獲得應(yīng)用程序的Label??
  • ????????????????Drawable?icon?=?reInfo.loadIcon(pm);?//?獲得應(yīng)用程序圖標(biāo)??
  • ????????????????//?為應(yīng)用程序的啟動Activity?準(zhǔn)備Intent??
  • ????????????????Intent?launchIntent?=?new?Intent();??
  • ????????????????launchIntent.setComponent(new?ComponentName(pkgName,??
  • ????????????????????????activityName));??
  • ????????????????//?創(chuàng)建一個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);??
  • ????????????}??
  • ????????}??
  • ????}??
  • }</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(); // 查詢所有應(yīng)用程序信息BrowseApplicationInfoAdapter browseAppAdapter = new BrowseApplicationInfoAdapter(this, mlistAppInfo);listview.setAdapter(browseAppAdapter);listview.setOnItemClickListener(this);}// 點擊跳轉(zhuǎn)至該應(yīng)用程序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);// 調(diào)用系統(tǒng)排序 , 根據(jù)name排序// 該排序很重要,否則只能顯示系統(tǒng)應(yīng)用,而不能列出第三方應(yīng)用程序Collections.sort(resolveInfos,new ResolveInfo.DisplayNameComparator(pm));if (mlistAppInfo != null) {mlistAppInfo.clear();for (ResolveInfo reInfo : resolveInfos) {String activityName = reInfo.activityInfo.name; // 獲得該應(yīng)用程序的啟動Activity的nameString pkgName = reInfo.activityInfo.packageName; // 獲得應(yīng)用程序的包名String appLabel = (String) reInfo.loadLabel(pm); // 獲得應(yīng)用程序的LabelDrawable icon = reInfo.loadIcon(pm); // 獲得應(yīng)用程序圖標(biāo)// 為應(yīng)用程序的啟動Activity 準(zhǔn)備IntentIntent launchIntent = new Intent();launchIntent.setComponent(new ComponentName(pkgName,activityName));// 創(chuàng)建一個AppInfo對象,并賦值A(chǔ)ppInfo 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對象。

    ?????? 圖:

    ????????????? ?????????

    ?

    ?過濾應(yīng)用程序如下:

    [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;?//?所有應(yīng)用程序??
  • ????public?static?final?int?FILTER_SYSTEM_APP?=?1;?//?系統(tǒng)程序??
  • ????public?static?final?int?FILTER_THIRD_APP?=?2;?//?第三方應(yīng)用程序??
  • ????public?static?final?int?FILTER_SDCARD_APP?=?3;?//?安裝在SDCard的應(yīng)用程序??
  • ??
  • ????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.?*/??
  • ????@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);?//?查詢所有應(yīng)用程序信息??
  • ????????//?構(gòu)建適配器,并且注冊到listView??
  • ????????browseAppAdapter?=?new?BrowseApplicationInfoAdapter(this,?mlistAppInfo);??
  • ????????listview.setAdapter(browseAppAdapter);??
  • ????}??
  • ????//?根據(jù)查詢條件,查詢特定的ApplicationInfo??
  • ????private?List<AppInfo>?queryFilterAppInfo(int?filter)?{??
  • ????????pm?=?this.getPackageManager();??
  • ????????//?查詢所有已經(jīng)安裝的應(yīng)用程序??
  • ????????List<ApplicationInfo>?listAppcations?=?pm??
  • ????????????????.getInstalledApplications(PackageManager.GET_UNINSTALLED_PACKAGES);??
  • ????????Collections.sort(listAppcations,??
  • ????????????????new?ApplicationInfo.DisplayNameComparator(pm));//?排序??
  • ????????List<AppInfo>?appInfos?=?new?ArrayList<AppInfo>();?//?保存過濾查到的AppInfo??
  • ????????//?根據(jù)條件來過濾??
  • ????????switch?(filter)?{??
  • ????????case?FILTER_ALL_APP:?//?所有應(yīng)用程序??
  • ????????????appInfos.clear();??
  • ????????????for?(ApplicationInfo?app?:?listAppcations)?{??
  • ????????????????appInfos.add(getAppInfo(app));??
  • ????????????}??
  • ????????????return?appInfos;??
  • ????????case?FILTER_SYSTEM_APP:?//?系統(tǒng)程序??
  • ????????????appInfos.clear();??
  • ????????????for?(ApplicationInfo?app?:?listAppcations)?{??
  • ????????????????if?((app.flags?&?ApplicationInfo.FLAG_SYSTEM)?!=?0)?{??
  • ????????????????????appInfos.add(getAppInfo(app));??
  • ????????????????}??
  • ????????????}??
  • ????????????return?appInfos;??
  • ????????case?FILTER_THIRD_APP:?//?第三方應(yīng)用程序??
  • ????????????appInfos.clear();??
  • ????????????for?(ApplicationInfo?app?:?listAppcations)?{??
  • ????????????????//非系統(tǒng)程序??
  • ????????????????if?((app.flags?&?ApplicationInfo.FLAG_SYSTEM)?<=?0)?{??
  • ????????????????????appInfos.add(getAppInfo(app));??
  • ????????????????}???
  • ????????????????//本來是系統(tǒng)程序,被用戶手動更新后,該系統(tǒng)程序也成為第三方應(yīng)用程序了??
  • ????????????????else?if?((app.flags?&?ApplicationInfo.FLAG_UPDATED_SYSTEM_APP)?!=?0){??
  • ????????????????????appInfos.add(getAppInfo(app));??
  • ????????????????}??
  • ????????????}??
  • ????????????break;??
  • ????????case?FILTER_SDCARD_APP:?//?安裝在SDCard的應(yīng)用程序??
  • ????????????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;??
  • ????}??
  • ????//?構(gòu)造一個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;??
  • ????}??
  • }??
  • 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; // 所有應(yīng)用程序public static final int FILTER_SYSTEM_APP = 1; // 系統(tǒng)程序public static final int FILTER_THIRD_APP = 2; // 第三方應(yīng)用程序public static final int FILTER_SDCARD_APP = 3; // 安裝在SDCard的應(yīng)用程序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); // 查詢所有應(yīng)用程序信息// 構(gòu)建適配器,并且注冊到listViewbrowseAppAdapter = new BrowseApplicationInfoAdapter(this, mlistAppInfo);listview.setAdapter(browseAppAdapter);}// 根據(jù)查詢條件,查詢特定的ApplicationInfoprivate List<AppInfo> queryFilterAppInfo(int filter) {pm = this.getPackageManager();// 查詢所有已經(jīng)安裝的應(yīng)用程序List<ApplicationInfo> listAppcations = pm.getInstalledApplications(PackageManager.GET_UNINSTALLED_PACKAGES);Collections.sort(listAppcations,new ApplicationInfo.DisplayNameComparator(pm));// 排序List<AppInfo> appInfos = new ArrayList<AppInfo>(); // 保存過濾查到的AppInfo// 根據(jù)條件來過濾switch (filter) {case FILTER_ALL_APP: // 所有應(yīng)用程序appInfos.clear();for (ApplicationInfo app : listAppcations) {appInfos.add(getAppInfo(app));}return appInfos;case FILTER_SYSTEM_APP: // 系統(tǒng)程序appInfos.clear();for (ApplicationInfo app : listAppcations) {if ((app.flags & ApplicationInfo.FLAG_SYSTEM) != 0) {appInfos.add(getAppInfo(app));}}return appInfos;case FILTER_THIRD_APP: // 第三方應(yīng)用程序appInfos.clear();for (ApplicationInfo app : listAppcations) {//非系統(tǒng)程序if ((app.flags & ApplicationInfo.FLAG_SYSTEM) <= 0) {appInfos.add(getAppInfo(app));} //本來是系統(tǒng)程序,被用戶手動更新后,該系統(tǒng)程序也成為第三方應(yīng)用程序了else if ((app.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0){appInfos.add(getAppInfo(app));}}break;case FILTER_SDCARD_APP: // 安裝在SDCard的應(yīng)用程序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;}// 構(gòu)造一個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;} }

    ????你可以在此基礎(chǔ)上,構(gòu)建更多豐富的應(yīng)用。比說說Settings模塊中的卸載安裝應(yīng)用程序等。?

    ?

    ?

    ??? 本節(jié)的源代碼已上傳,下載地址:http://download.csdn.net/detail/qinjuning/3775869

    總結(jié)

    以上是生活随笔為你收集整理的Android中获取应用程序(包)的信息-----PackageManager的使用(一)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。