android之获取所有的app(getPackageManager)

image.png

getPackageManager

Android的应用管理主要是通过PackageManagerService来完成的。

PackageManagerService服务负责各种APK包的安装、卸载、优化和查询。

PackageManagerService在启动时会扫描所有的APK文件和Jar包,然后把他们的信息读取出来,保存在内存中,这样系统在运行时就能迅速找到各种应用和组件的信息。

扫描过程中如果遇到没有优化的文件,还要执行转换工作,将app文件从dex格式转换为oat格式(Android5.0之前是转换为odex格式)。

packageInfo

PackageInfo用于描述mainfest中所有描述信息。

字段 含义
public String packageName 包名
public String[] splitNames
public int versionCode 版本号
public String versionName 版本名称
public ApplicationInfo applicationInfo
public long firstInstallTime 第一次安装时间
public long lastUpdateTime 上次更新时间
public ActivityInfo[] activities 所有的Activity信息
public ActivityInfo[] receivers 所有的广播接收者
public ServiceInfo[] services 所有的服务信息
public ProviderInfo[] providers 获取ContentProvide
public PermissionInfo[] permissions 所有的权限信息

接口:

PackageInfo packageInfo = packageManager.getPackageInfo(
                    context.getApplicationInfo().packageName, 0);

applicationInfo

ApplicationInfo描述应用程序的基本信息

字段 含义
public String taskAffinity
public String permission 权限
public String processName 名字
public String className 类名
public int descriptionRes
public static final int FLAG_SYSTEM = 1<<0 系统应用
public static final int FLAG_EXTERNAL_STORAGE = 1<<18 安装在外部存储卡
public static final int FLAG_LARGE_HEAP = 1<<20 支持大内存

实战

package com.exmple.packgetest;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Context;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.util.Log;

import java.util.List;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        getAllAppNames();
    }

    public void getAllAppNames(){
        PackageManager pm=getPackageManager();
        ////获取到所有安装了的应用程序的信息,包括那些卸载了的,但没有清除数据的应用程序
        List list2=pm.getInstalledPackages(PackageManager.GET_UNINSTALLED_PACKAGES);

        int j=0;

        for (PackageInfo packageInfo : list2) {
            //得到手机上已经安装的应用的名字,即在AndriodMainfest.xml中的app_name。
            String appName=packageInfo.applicationInfo.loadLabel(getPackageManager()).toString();
            //得到手机上已经安装的应用的图标,即在AndriodMainfest.xml中的icon。
            Drawable drawable = packageInfo.applicationInfo.loadIcon(getPackageManager());
            //得到应用所在包的名字,即在AndriodMainfest.xml中的package的值。
            String packageName=packageInfo.packageName;
            Log.e("=======aaa", "应用的名字:"+appName);
            Log.e("=======bbbb", "应用的包名字:"+packageName);

            j++;
        }
        Log.e("========cccccc", "应用的总个数:"+j);
    }
}

执行结果:
log截取:

2020-11-30 14:59:36.186 29953-29953/com.exmple.packgetest E/=======aaa: 应用的名字:信息
2020-11-30 14:59:36.186 29953-29953/com.exmple.packgetest E/=======bbbb: 应用的包名字:com.samsung.android.messaging
2020-11-30 14:59:36.191 29953-29953/com.exmple.packgetest E/=======aaa: 应用的名字:融合定位
2020-11-30 14:59:36.191 29953-29953/com.exmple.packgetest E/=======bbbb: 应用的包名字:com.baidu.location.fused
2020-11-30 14:59:36.191 29953-29953/com.exmple.packgetest E/=======aaa: 应用的名字:com.android.backupconfirm
2020-11-30 14:59:36.191 29953-29953/com.exmple.packgetest E/=======bbbb: 应用的包名字:com.android.backupconfirm
2020-11-30 14:59:36.198 29953-29953/com.exmple.packgetest E/=======aaa: 应用的名字:KLMS Agent
2020-11-30 14:59:36.198 29953-29953/com.exmple.packgetest E/=======bbbb: 应用的包名字:com.samsung.klmsagent
2020-11-30 14:59:36.202 29953-29953/com.exmple.packgetest E/=======aaa: 应用的名字:提示
2020-11-30 14:59:36.202 29953-29953/com.exmple.packgetest E/=======bbbb: 应用的包名字:com.samsung.android.app.tips
2020-11-30 14:59:36.207 29953-29953/com.exmple.packgetest E/=======aaa: 应用的名字:SmartFittingService
2020-11-30 14:59:36.207 29953-29953/com.exmple.packgetest E/=======bbbb: 应用的包名字:com.samsung.android.smartfitting
2020-11-30 14:59:36.220 29953-29953/com.exmple.packgetest E/=======aaa: 应用的名字:三星安装向导
2020-11-30 14:59:36.220 29953-29953/com.exmple.packgetest E/=======bbbb: 应用的包名字:com.sec.android.app.SecSetupWizard
2020-11-30 14:59:36.228 29953-29953/com.exmple.packgetest E/=======aaa: 应用的名字:分享至电脑
2020-11-30 14:59:36.228 29953-29953/com.exmple.packgetest E/=======bbbb: 应用的包名字:com.samsung.android.mtpshareapp
2020-11-30 14:59:36.233 29953-29953/com.exmple.packgetest E/=======aaa: 应用的名字:BstSpamCallService
2020-11-30 14:59:36.233 29953-29953/com.exmple.packgetest E/=======bbbb: 应用的包名字:com.bst.spamcall
2020-11-30 14:59:36.236 29953-29953/com.exmple.packgetest E/=======aaa: 应用的名字:Activation
2020-11-30 14:59:36.236 29953-29953/com.exmple.packgetest E/=======bbbb: 应用的包名字:com.samsung.android.activation
2020-11-30 14:59:36.288 29953-29953/com.exmple.packgetest E/=======aaa: 应用的名字:通话设置

你可能感兴趣的:(android之获取所有的app(getPackageManager))