android群英传笔记 android apk应用信息获取

查询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;
    }




}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值