《Android群英传》读书笔记(10)第九章:Android系统信息与安全机制

来源:互联网 发布:陈秋平网络大电影 编辑:程序博客网 时间:2024/04/29 18:47

  1. Android系统信息获取

获取系统信息的途径,有下面两种途径:

  • android.os.Build
  • SystemProperty
android.os.Build类里面的信息非常丰富,它包含了系统编译时的大量设备、配置信息,下面列举了一些:

  • Build.BOARD——主板
  • Build.BRAND——Android系统定制商
  • Build.SUPPORTED_ABIS——CPU指令集
  • Build.DEVICE——设备参数
  • Build.DISPLAY——显示屏参数
  • Build.FINGERPRINT——唯一编号
  • Build.SERIAL——硬件序列号
  • Build.ID——修订版本列表
  • Build.MANUFACTURER——硬件制造商
  • Build.MODEL——版本
  • Build.HARDWARE——硬件名
  • Build.PRODUCT——手机产品名
  • Build.TAGS——描述Build的标签
  • Build.TYPE——Builder类型
  • Build.VERSION.CODENAME——当前开发代号
  • Build.VERSION.INCREMENTAL——源码控制版本号
  • Build.VERSION.RELEASE——版本字符串
  • Build.VERSION.SDK_INT——版本号
  • Build.HOST——host值
  • Build.USER——User名
  • Build.TIME——编译时间
下面来看一下SystemProperty里的常用参数,可以通过System.getProperty:

  • os.version——OS版本
  • os.name——OS名称
  • os.arch——OS架构
  • user.home——home属性
  • user.name——name属性
  • user.dir——Dir属性
  • user.timezone——时区
  • path.separator——路径分隔符
  • line.separator——行分隔符
  • file.separator——文件分隔符
  • java.vendor.url——Java vender Url属性
  • java.class.path——Java Class属性
  • java.class.version——Java Class版本
  • java.vendor——Java Vender属性
  • java.version——Java版本
  • java.home——Java Home属性

2.PackageManager

Android提供了PackageManager来负责管理所有已安装的App,PackageManager可以获得AndroidManifest中不同节点的封装信息,下面是一些常用的封装信息:
  • ActivityInfo
ActivityInfo封装在了Mainfest文件中的<activity></activity>和<receiver></receiver>之间的所有信息,包括name、icon、label、launchMode等。
  • ServiceInfo
ServiceInfo与ActivityInfo类似,封装了<service></service>之间的所有信息。
  • ApplicationInfo
它封装了<application></application>之间的信息,特别的是,ApplicationInfo包含了很多Flag,FLAG_SYSTEM表示为系统应用,FLAG_EXTERNAL_STORAGE表示为安装在SDcard上的应用,通过这些flag可以很方便的判断应用的类型。
  • PackageInfo
PackageInfo包含了所有的Activity和Service信息。
  • ResolveInfo
ResolveInfo包含了<intent>信息的上级信息,所以它可以返回ActivityInfo、ServiceInfo等包含了<intent>的信息,经常用来帮助找到那些包含特定intent条件的信息,如带分享功能、播放功能的应用。
有了这些封装的信息后,还需要有特定的方法来获取它们,下面就是PackageManager中封装的用来获取这些信息的方法:
  • getPackageManager()——通过这个方法可以返回一个PackageManager对象。
  • getApplicationInfo()——以ApplicationInfo的形式返回指定包名的ApplicationInfo。
  • getApplicationIcon()——返回指定包名的Icon。
  • getInstalledApplications()——以ApplicationInfo的形式返回安装的应用。
  • getInstalledPackages()——以PackageInfo的形式返回安装的应用。
  • queryIntentActivities()——返回指定Intent的ResolveInfo对象、Activity集合。
  • queryIntentServices()——返回指定Intent的ResolveInfo对象、Service集合。
  • resolveActivity()——返回指定Intent的Activity。
  • resolveService()——返回指定Intent的Service。
根据ApplicationInfo的flag来判断App的类型:
如果当前应用的flags & ApplicationInfo.FLAG_SYSTEM != 0则为系统应用
如果flags & ApplicationInfo.FLAG_SYSTEM <= 0 则为第三方应用
特殊的当系统应用升级后也会成为第三方应用,此时 flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP != 0;
如果flags & ApplicationInfo.FLAG_EXTERNAL_STORAGE != 0 则为安装在SDCard上的应用。

下面是一个列出手机上安装的所有App的示例:
public class PkgMgr extends AppCompatActivity implements View.OnClickListener {    private PackageManager mPackageManager;    private ListView mList;    private PkgAdapter mAdapter;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_pkg_mgr);        mPackageManager = getPackageManager();        mList = (ListView) findViewById(R.id.list);        mAdapter = new PkgAdapter(this);        mList.setEmptyView(findViewById(R.id.empty));        mList.setAdapter(mAdapter);        findViewById(R.id.btn_all).setOnClickListener(this);        findViewById(R.id.btn_third).setOnClickListener(this);        findViewById(R.id.btn_system).setOnClickListener(this);    }    @Override    public void onClick(View v) {        List<AppInfo> result;        switch (v.getId()) {            case R.id.btn_all:                result = getAppInfo(R.id.btn_all);                break;            case R.id.btn_third:                result = getAppInfo(R.id.btn_third);                break;            case R.id.btn_system:                result = getAppInfo(R.id.btn_system);                break;            default:                result = new ArrayList<>();        }        mAdapter.addAll(result);    }    private List<AppInfo> getAppInfo(int flag) {        List<ApplicationInfo> appInfos = mPackageManager.getInstalledApplications(                PackageManager.GET_UNINSTALLED_PACKAGES);        List<AppInfo> list = new ArrayList<>();        //根据不同的flag来切换显示不同的App类型        switch (flag) {            case R.id.btn_all:                list.clear();                for (ApplicationInfo appInfo : appInfos) {                    list.add(makeAppInfo(appInfo));                }                break;            case R.id.btn_third:                list.clear();                for (ApplicationInfo appInfo : appInfos) {                    if ((appInfo.flags & ApplicationInfo.FLAG_SYSTEM) <= 0) {                        list.add(makeAppInfo(appInfo));                    } else if ((appInfo.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0){                        list.add(makeAppInfo(appInfo));                    }                }                break;            case R.id.btn_system:                list.clear();                for (ApplicationInfo appInfo : appInfos) {                    if ((appInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0) {                        list.add(makeAppInfo(appInfo));                    }                }                break;        }        return list;    }    private AppInfo makeAppInfo(ApplicationInfo appInfo) {        AppInfo info = new AppInfo();        info.setAppIcon(appInfo.loadIcon(mPackageManager));        info.setAppLabel(appInfo.loadLabel(mPackageManager).toString());        info.setPkgName(appInfo.packageName);        return info;    }}
下面是Adapter类:
public class PkgAdapter extends BaseAdapter {    private Context mContext;    private List<AppInfo> mList;    public PkgAdapter(Context context) {        mContext = context;        mList = new ArrayList<>();    }    public void addAll(List<AppInfo> list) {        mList.clear();        mList.addAll(list);        notifyDataSetChanged();    }    @Override    public int getCount() {        return mList.size();    }    @Override    public AppInfo getItem(int position) {        return mList.get(position);    }    @Override    public long getItemId(int position) {        return position;    }    @Override    public View getView(int position, View convertView, ViewGroup parent) {        ViewHolder holder;        AppInfo item = getItem(position);        if (convertView == null) {            holder = new ViewHolder();            convertView = LayoutInflater.from(mContext).inflate(R.layout.item_app_info, parent, false);            holder.mIcon = (ImageView) convertView.findViewById(R.id.iv_icon);            holder.mLabel = (TextView) convertView.findViewById(R.id.tv_label);            holder.mPkgName = (TextView) convertView.findViewById(R.id.tv_pkg_name);            convertView.setTag(holder);        } else {            holder = (ViewHolder) convertView.getTag();        }        holder.mIcon.setImageDrawable(item.getAppIcon());        holder.mLabel.setText(item.getAppLabel());        holder.mPkgName.setText(item.getPkgName());        return convertView;    }    static class ViewHolder{        ImageView mIcon;        TextView mLabel;        TextView mPkgName;    }}

AppInfo 类,将获得的ApplicationInfo进一步封装,在ListView中显示:
public class AppInfo {    private String appLabel;    private String pkgName;    private Drawable appIcon;    public String getAppLabel() {        return appLabel;    }    public void setAppLabel(String appLabel) {        this.appLabel = appLabel;    }    public String getPkgName() {        return pkgName;    }    public void setPkgName(String pkgName) {        this.pkgName = pkgName;    }    public Drawable getAppIcon() {        return appIcon;    }    public void setAppIcon(Drawable appIcon) {        this.appIcon = appIcon;    }}
下面是运行效果:

3.ActivityManager

与PackageManager不同,ActivityManager侧重于获取正在运行的应用程序信息,可以通过context.getSystemService(Context.ACTIVITY_SERVICE);来获得。下面是这个类中封装的一些信息:
  • ActivityManager.MemoryInfo——MemoryInfo有几个非常重要的字段:availMem(系统可用内存),totalMem(总内存),threshold(低内存的阈值,即区分是否低内存的临界值),lowMemory(是否处于低内存)。
  • Debug.MemoryInfo——这个MemoryInfo用于统计进程下的内存信息。
  • RunningAppProcessInfo——运行进程的信息,存储的字段有:processName(进程名),pid(进程pid),uid(进程uid),pkgList(该进程下的所有包)
  • RunningServiceInfo——运行的服务信息,在它里面同样包含了一些服务进程信息,同时还有一些其他信息。activeSince(第一次被激活的时间、方式),foreground(服务是否在后台执行)。
下面是使用ActivityManager获取运行的进程信息的示例:
public class  AtyMgr extends AppCompatActivity{    private ActivityManager am;    private ListView mList;    private AtyAdapter mAdapter;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_aty_mgr);        am = (ActivityManager) getSystemService(ACTIVITY_SERVICE);        mList = (ListView) findViewById(R.id.aty_list);        mAdapter = new AtyAdapter(this,getRunningProcessInfo());        mList.setAdapter(mAdapter);    }    private List<AtyInfo> getRunningProcessInfo() {        List<ActivityManager.RunningAppProcessInfo> processInfoList;        processInfoList = am.getRunningAppProcesses();        List<AtyInfo> result = new ArrayList<>();        Log.d("TAG", "size = " + processInfoList.size());        for (ActivityManager.RunningAppProcessInfo processInfo : processInfoList) {            result.add(makeProcessInfo(processInfo));        }        return result;    }    private AtyInfo makeProcessInfo(ActivityManager.RunningAppProcessInfo processInfo) {        AtyInfo atyInfo = new AtyInfo();        atyInfo.setPid(processInfo.pid + "");        atyInfo.setUid(processInfo.uid + "");        Debug.MemoryInfo[] memoryInfos = am.getProcessMemoryInfo(new int[]{processInfo.pid});        int memorySize = memoryInfos[0].getTotalPss();        atyInfo.setMemory(memorySize);        atyInfo.setProcessName(processInfo.processName);        return atyInfo;    }}
Adapter的代码与上面PackageManager示例类似,不再贴出来了。

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 考到不好的大学怎么办 考的大学不理想怎么办 只考上二本大学怎么办 w7电脑中病毒了怎么办 电脑中病毒了该怎么办 泰迪呼吸急促怎么办啊 狗狗呼吸急促是怎么办 狗狗着凉了呕吐怎么办 狗鼻子流黄鼻涕怎么办 刚出生婴儿睡觉不踏实怎么办 有人溺水后你该怎么办 借钱不还怎么办没欠条 私人欠货款不还怎么办 公司欠货款不还怎么办 两个人离婚一方不同意怎么办 比亚迪l3油耗高怎么办 u盘密码忘记了怎么办 主板没有m.2接口怎么办 点痣留下了疤怎么办 危险三角区长痘痘怎么办 挤了危险三角区怎么办 三角区长痘挤了怎么办 三角区发红长痘怎么办 激光祛斑碰水了怎么办 激光打痣留下坑怎么办 点痣之后留下坑怎么办 去痣留下的红印怎么办 激光点痦子留疤怎么办 激光点痣的疤痕怎么办 做完眉毛碰水了怎么办 脸上疤掉了有坑怎么办 结痂不小心抠掉怎么办 脸上肉松弛怎么办19岁 点痣留下来的疤怎么办 激光祛斑的红印怎么办 脸上疤掉了红印怎么办 痘痘发炎了红肿怎么办 脸上的斑越来越多了怎么办 点痣留下的疤痕怎么办 额头又高又大怎么办 脸太长额头太高怎么办