查询APK应用相关主要用到两个助手:PM(PackageManager)和AM(ActivityManager).PM主宰着应用的包管理,获取应用包信息。AM主宰者应用的活动管理,获得运行的应用程序信息。
例举一些常用的系统封装信息
PackageManager
ActivityInfo:封装了再Mainifest文件中<activity></activity>和<receiver></receiver>之间的所有信息。包括name,icon,label,launchmod等
ServiceInfo:封装了<service></service>之间的所有信息。
ApplicationInfo:封装了<application></application>之间的信息,不过特别的是ApplicationInfo包含很说Flag,可以根据这些flag来判断应用类型,比如FLAG_SYSTEM表示为系统应用。
PackageInfo:包含了所有activity service等信息。
ResolveInfo:包含<intent>信息的上一级信息,它可以返回ActivityInfo ,ServiceInfo等包含<intent>的信息,常用来,帮助我们找那些饱含特定Intent条件信息,如带分享功能,播放功能的应用。
示例:
public class AppInfoActivity extends AppCompatActivity implements View.OnClickListener { private List<PMAppInfo> appInfoList = new ArrayList<>(); private PackageManager pm; public static final int All_APP = 1; public static final int SYSTEM_APP = 2; public static final int THIRD_APP = 3; public static final int SDCARD_APP = 4; private ListView list; private MyAdapter adapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_app_info); initView(); } private void initView() { findViewById(R.id.all).setOnClickListener(this); findViewById(R.id.system).setOnClickListener(this); findViewById(R.id.three).setOnClickListener(this); findViewById(R.id.sdCard).setOnClickListener(this); list = ((ListView) findViewById(R.id.list)); appInfoList = getAppInfoList(1); adapter = new MyAdapter(this, appInfoList); list.setAdapter(adapter); } /** * pm = getPackageManager();获取一个PackageManager * pm.getApplicationInfo(); 以ApplicationInfo的形势返回指定包名的applicationInfo * pm.getApplicationIcon(); 返回指定包名的icon * pm.getInstalledApplications(); 以applicationInfo的形式返回安装的应用 * pm.getInstalledPackages(); 以packageInfo的形式返回安装的应用 * pm.queryIntentActivities(); 返回指定intent的resolveInfo对象,activity的集合 * pm.queryIntentServices(); 返回指定intent的resolveInfo对象,Services的集合 * pm.resolveActivity(); 返回指定的intent的activity * pm.resolveService(); 返回指定intent的service * @param flag * @return */ private List<PMAppInfo> getAppInfoList(int flag) { pm = getPackageManager(); List<ApplicationInfo> applications = pm.getInstalledApplications(PackageManager.GET_UNINSTALLED_PACKAGES); List<PMAppInfo> appInfoList = new ArrayList<>(); switch (flag) { case All_APP://所有应用 appInfoList.clear(); for (ApplicationInfo app : applications) { appInfoList.add(makeAppInfo(app)); } break; case SYSTEM_APP: //系统应用 appInfoList.clear(); for (ApplicationInfo app : applications) { if ((app.flags & ApplicationInfo.FLAG_SYSTEM) != 0) { appInfoList.add(makeAppInfo(app)); } } break; case THIRD_APP://第三方应用 appInfoList.clear(); appInfoList.clear(); for (ApplicationInfo app : applications) { if ((app.flags & ApplicationInfo.FLAG_SYSTEM) <= 0) { appInfoList.add(makeAppInfo(app)); } else if ((app.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0) { appInfoList.add(makeAppInfo(app)); } } break; case SDCARD_APP://sd卡上的应用 appInfoList.clear(); appInfoList.clear(); for (ApplicationInfo app : applications) { if ((app.flags & ApplicationInfo.FLAG_EXTERNAL_STORAGE) != 0) { appInfoList.add(makeAppInfo(app)); } } break; } return appInfoList; } private PMAppInfo makeAppInfo(ApplicationInfo app) { PMAppInfo pmAppInfo = new PMAppInfo(); pmAppInfo.setAppLabel((String) app.loadLabel(pm)); pmAppInfo.setAppIcon(app.loadIcon(pm)); pmAppInfo.setPkgName(app.packageName); return pmAppInfo; } @Override public void onClick(View view) { switch (view.getId()) { case R.id.all: appInfoList = getAppInfoList(1); case R.id.system: appInfoList = getAppInfoList(2); break; case R.id.three: appInfoList = getAppInfoList(3); break; case R.id.sdCard: appInfoList = getAppInfoList(4); break; } adapter.notifyDate(appInfoList); adapter.notifyDataSetChanged(); } }
ActivityManager
ActivityManager.MemoryInfo:用于获取全局的内存使用信息。MemoryInfo有几个非常重要的字段:availMem-系统可用内存。totalMem-总内存,threshold-第内存的阈值,即区分是否是内存的临界值。lowMemory-是否处于第内存。
Debug,MemoryInfo:用于获取进程下的内存信息。
RunningAppProcessInfo:运行进程信息,存储的字段自然是进程相关的信息,processName-进程名,pid-进程pid,uid-进程uid,pkgList-该进程下的所有包。
RunningServiceInfo:用于封装运行的服务信息,在它里面同样包含了一些服务进程的信息,同时还包括一些其他信息。activeSine-第一次激活时间,方式,foregroung-服务是否在后台执行。
示例:
public class AMProcessActivity extends AppCompatActivity { private List<AMProcessInfo> amProcessInfos; private ActivityManager activityManager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_amprocess); initParams(); } private void initParams() { activityManager = ((ActivityManager) getSystemService(ACTIVITY_SERVICE)); getRunningProcessInfo(); } private List<AMProcessInfo> getRunningProcessInfo() { amProcessInfos = new ArrayList<>(); List<ActivityManager.RunningAppProcessInfo> appProcessInfos = activityManager.getRunningAppProcesses(); for (int i = 0; i < appProcessInfos.size(); i++) { ActivityManager.RunningAppProcessInfo info = appProcessInfos.get(i); int pid = info.pid; int uid = info.uid; String processName = info.processName; int[] memoryPid = new int[]{pid}; Debug.MemoryInfo[] memoryInfo = activityManager.getProcessMemoryInfo(memoryPid); int memorySize = memoryInfo[0].getTotalPss(); AMProcessInfo amProcessInfo = new AMProcessInfo(); amProcessInfo.setMemorySize(memorySize + ""); amProcessInfo.setPid(pid + ""); amProcessInfo.setProcessName(processName); amProcessInfo.setUid(uid + ""); amProcessInfos.add(amProcessInfo); } LogUtil.i("AMProcessActivity","amProcessInfos: "+amProcessInfos); return amProcessInfos; } }