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

歡迎訪問 生活随笔!

生活随笔

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

Android

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

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

轉(zhuǎn)載:http://blog.csdn.net/qinjuning/article/details/6867806

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

?部分,計(jì)劃如下:

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

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

?

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

?

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

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

?

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

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

?

????PackageItemInfo類

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

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

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

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

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

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

?????????????? public?String packagename?? 獲得該應(yīng)用程序的包名?(對(duì)應(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é)點(diǎn)的信息 。我們可以通過它來獲取我們?cè)O(shè)置的任何屬性,包括

????? theme 、launchMode、launchmode等

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

?

?? ServiceInfo 類

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

?

? ?ApplicationInfo類 繼承自? PackageItemInfo

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

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

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

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

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

?

? ResolveInfo類

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

???????常用字段

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

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

???? ? 常用方法?

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

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

?

?PackageInfo類

????? ?說明:手動(dòng)獲取AndroidManifest.xml文件的信息 。

???????常用字段

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

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

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

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

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

?

PackageManger 類

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

????? 常用方法

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

???????????????功能:獲得一個(gè)PackageManger對(duì)象

?????? ??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對(duì)象

?

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

?????????????? 參數(shù):flag為一般為GET_UNINSTALLED_PACKAGES,那么此時(shí)會(huì)返回所有ApplicationInfo。我們可以對(duì)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對(duì)象(本質(zhì)上是Activity)?

?

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

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

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

?

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

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

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

?

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

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

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

?

二、DEMO講解

?

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

知道到這點(diǎn)了,理解起來就不是很難了。

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

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

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

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

?

? ??? Demo1? :

1 、布局文件: 主要有兩個(gè):帶listview的browse_app_list.xml文件 ;listview的項(xiàng)browse_app_item.xml

browse_app_list.xml

<?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

<?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類

/Model類 ,用來存儲(chǔ)應(yīng)用程序信息 public class AppInfo { private String appLabel; //應(yīng)用程序標(biāo)簽 private Drawable appIcon ; //應(yīng)用程序圖像 private Intent intent ; //啟動(dòng)應(yīng)用程序的Intent ,一般是Action為Main和Category為Lancher的Activity private String pkgName ; //應(yīng)用程序所對(duì)應(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提供視圖

//自定義適配器類,提供給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); } } }

4 、MainActivity.java 主工程邏輯?

????????? 請(qǐng)仔細(xì)體會(huì)queryIntentActivities()方法,并且注意到排序,它很重要。

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); } // 點(diǎn)擊跳轉(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); } // 獲得所有啟動(dòng)Activity的信息,類似于Launch界面 public void queryAppInfo() { PackageManager pm = this.getPackageManager(); // 獲得PackageManager對(duì)象 Intent mainIntent = new Intent(Intent.ACTION_MAIN, null); mainIntent.addCategory(Intent.CATEGORY_LAUNCHER); // 通過查詢,獲得所有ResolveInfo對(duì)象. 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)用程序的啟動(dò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)用程序的啟動(dòng)Activity 準(zhǔn)備Intent Intent launchIntent = new Intent(); launchIntent.setComponent(new ComponentName(pkgName, activityName)); // 創(chuàng)建一個(gè)AppInfo對(duì)象,并賦值 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); } } } }
好了,第一個(gè)Demo完成 。。?

?

?Demo 2:

?????? ?demo2在布局、適配器方面和Demo1一樣。只是利用了getInstalledApplications()方法,繼而通過ApplicationInfo.flags來挑選

? 我們希望的ApplicationInfo對(duì)象。





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

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)建適配器,并且注冊(cè)到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)程序,被用戶手動(dò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)造一個(gè)AppInfo對(duì)象 ,并賦值 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)容還不錯(cuò),歡迎將生活随笔推薦給好友。