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(); }}
- Android群英传——第九章使用PackageManager获取应用包信息
- Android群英传——第九章ActivityManager获取信息
- Android获取应用程序信息——PackageManager的基本使用
- Android获取应用程序信息——PackageManager的基本使用
- Android中获取应用程序(包)的信息-----PackageManager的使用
- Android中获取应用程序(包)的信息-----PackageManager的使用
- Android中获取应用程序(包)的信息-----PackageManager的使用
- Android中获取应用程序(包)的信息-----PackageManager的使用
- Android中获取应用程序(包)的信息-----PackageManager的使用
- Android中获取应用程序(包)的信息-----PackageManager的使用
- Android中获取应用程序(包)的信息-----PackageManager的使用
- Android中获取应用程序(包)的信息--PackageManager的使用
- 【Android】获取应用程序(包)的信息-----PackageManager的使用(一)
- Android中获取应用程序(包)的信息-----PackageManager的使用
- Android中获取应用程序(包)的信息-----PackageManager的使用
- 通过PackageManager获取应用包的信息
- Android Apk 应用信息获取之 PackageManager
- 使用PackageManager来获取应用信息
- aliyun阿里云 Maven仓库地址
- Python 安装mysql错误的一种解决办法
- console里旋转的寿司
- app点击icon重启问题
- led
- Android群英传——第九章使用PackageManager获取应用包信息
- SLua在Unity5.4发布Android时报错
- 最长公共子序列
- js控制日期下拉列表
- PHP下载功能的实现和获得当前目录
- Java多线程(一)、多线程的基本概念和使用
- centos 163源
- java详解斐波那契数列
- C++学习日记