Android群英传——第九章使用PackageManager获取应用包信息

来源:互联网 发布:云警报警主机编程 编辑:程序博客网 时间:2024/06/05 08:49

Apk信息的获取

使用PM(PackageManager)和AM(ActivityManager)管理APK
PM负责包管理,AM负责Activity管理

在Mainifest.xml中,
activity与receiver标签会被系统封装为ActivityInfo类
service标签则会被封装为ServiceInfo类
application标签会被封装为ApplicationInfo类,ApplicationInfo包含很多Flag,FLAG_SYSTEM表示系统应用,FLAG_EXTRERNAL_STORAGE表示安装在SD上的应用,使用这些Flag可以判断应用的类型
mainifest标签则会被封装为PackageInfo类,包含了所有activity与service的信息
ResolveInfo则是封装intent标签的上一级信息,有可能是ActivityInfo也有可能是ServiceInfo,用来帮助我们找到含有特定intent的信息

有了上面各种Bean对象后,PackageManager就可以通过调用各种方法,返回不同的Bean对象了,有以下常见的方法:

getPackageManager(); // 返回一个PackageManager对象
getApplicationInfo();// 以ApplicationInffo的形式返回指定包名的ApplicationInfo
getApplicationIcon(); // 返回指定包名的ICON
getInstalledApplication(); //以ApplicationInfo的形式返回安装的应用
getInstalledPackages(); // 以PackageInfo的形式返回安装的应用
queryIntentActivities(); // 返回指定Intent的ResolveInfo对象,Activity集合
queryIntentAcrivity();// 返回指定intent的Activity
resolveService(); // 返回指定Intent的Service

通过PackageInfo筛选不同类型的App

将app相关信息封装为一个新的bean:

import android.graphics.drawable.Drawable;import java.util.List;/** * Created by feathers on 16-11-19. */public class PMAppInfo {    private String appLabel; //App名称    private Drawable appIcon; //App图标    private String pckName; // App包名    public String getAppLabel() {        return appLabel;    }    public void setAppLabel(String appLabel) {        this.appLabel = appLabel;    }    public Drawable getAppIcon() {        return appIcon;    }    public void setAppIcon(Drawable appIcon) {        this.appIcon = appIcon;    }    public String getPckName() {        return pckName;    }    public void setPckName(String pckName) {        this.pckName = pckName;    }    public PMAppInfo() {    }}

MainActivity

package com.example.myapplication;import android.content.pm.ApplicationInfo;import android.content.pm.PackageManager;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.ImageView;import android.widget.ListView;import android.widget.TextView;import org.w3c.dom.Text;import java.util.ArrayList;import java.util.List;public class MainActivity extends AppCompatActivity implements View.OnClickListener {    private static final int ALL_APP = 0;    private static final int SYSTEM_APP = 1;    private static final int THIRD_APP = 2;    private static final int SDCARD_APP = 3;    private PackageManager pm;    List<PMAppInfo> mData = new ArrayList<>();    private ListView mListView;    private BaseAdapter mAdapter;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        mListView = (ListView) findViewById(R.id.lv_apps);        mAdapter = new BaseAdapter() {            @Override            public int getCount() {                return mData.size();            }            @Override            public PMAppInfo getItem(int i) {                return mData.get(i);            }            @Override            public long getItemId(int i) {                return i;            }            @Override            public View getView(int i, View view, ViewGroup viewGroup) {                View v = View.inflate(MainActivity.this, R.layout.app_info, null);                ImageView icon = (ImageView) v.findViewById(R.id.iv_ic);                TextView appName = (TextView) v.findViewById(R.id.tv_name);                TextView pkgName = (TextView) v.findViewById(R.id.tv_pkgName);                icon.setImageDrawable(getItem(i).getAppIcon());                appName.setText(getItem(i).getAppLabel());                pkgName.setText(getItem(i).getPckName());                return v;            }        };        mListView.setAdapter(mAdapter);    }    private List<PMAppInfo> getAppInfo(int flag) {        pm = this.getPackageManager();        List<ApplicationInfo> listApp = pm.getInstalledApplications(PackageManager.GET_UNINSTALLED_PACKAGES);        List<PMAppInfo> appInfos = new ArrayList<>();        // 判断应用类型        switch (flag) {            // 所有应用            case ALL_APP:                appInfos.clear();                for (ApplicationInfo appinfo : listApp) {                    appInfos.add(makeAppInfo(appinfo));                }                break;            //系统应用            case SYSTEM_APP:                appInfos.clear();                for (ApplicationInfo app : listApp) {                    if ((app.flags & ApplicationInfo.FLAG_SYSTEM) != 0) {                        appInfos.add(makeAppInfo(app));                    }                }                break;            // 第三方应用            case THIRD_APP:                appInfos.clear();                for (ApplicationInfo appinfo : listApp) {                    if ((appinfo.flags & ApplicationInfo.FLAG_SYSTEM) <= 0) {                        appInfos.add(makeAppInfo(appinfo));                    } else if ((appinfo.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0) {                        appInfos.add(makeAppInfo(appinfo));                    }                    appInfos.add(makeAppInfo(appinfo));                }                break;            // sd卡中的应用            case SDCARD_APP:                appInfos.clear();                for (ApplicationInfo appinfo : listApp) {                    if ((appinfo.flags & ApplicationInfo.FLAG_EXTERNAL_STORAGE) != 0) {                        appInfos.add(makeAppInfo(appinfo));                    }                }                break;            default:                return null;        }        return appInfos;    }    private PMAppInfo makeAppInfo(ApplicationInfo app) {        PMAppInfo appInfo = new PMAppInfo();        appInfo.setAppIcon(app.loadIcon(pm));        appInfo.setAppLabel((String) app.loadLabel(pm));        appInfo.setPckName(app.packageName);        return appInfo;    }    @Override    public void onClick(View view) {        switch (view.getId()) {            case R.id.bt_all:                mData = getAppInfo(ALL_APP);                break;            case R.id.bt_sys:                mData = getAppInfo(SYSTEM_APP);                break;            case R.id.bt_third:                mData = getAppInfo(THIRD_APP);                break;            case R.id.bt_sdcard:                mData = getAppInfo(SDCARD_APP);                break;        }        mAdapter.notifyDataSetChanged();    }}

这里写图片描述

0 0
原创粉丝点击