《Android群英传》读书笔记(10)第九章:Android系统信息与安全机制
来源:互联网 发布:陈秋平网络大电影 编辑:程序博客网 时间:2024/04/29 18:47
- Android系统信息获取
获取系统信息的途径,有下面两种途径:
- android.os.Build
- SystemProperty
- 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——编译时间
- 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
- ServiceInfo
- ApplicationInfo
- PackageInfo
- ResolveInfo
有了这些封装的信息后,还需要有特定的方法来获取它们,下面就是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
- 《Android群英传》读书笔记(10)第九章:Android系统信息与安全机制
- 《Android群英传》读书笔记9.Android系统信息与安全机制
- Android群英传知识点回顾——第九章:Android系统信息与安全机制
- Android群英传学习——第九章、Android系统信息与安全机制
- Android群英传笔记——第九章:Android系统信息和安全机制
- Android群英传笔记——第九章:Android系统信息和安全机制
- Android群英转读书笔记第9章(Android 系统信息与安全机制)
- Android群英传——第九章五道安全防线与系统隐患
- 《Android群英传》读书笔记(5)第六章:Android绘图机制与处理技巧之一
- 《Android群英传》读书笔记(6)第六章:Android绘图机制与处理技巧之二
- 《Android群英传》读书笔记(7)第六章:Android绘图机制与技巧之三
- 《Android群英传》读书笔记(8)第七章:Android动画机制与使用技巧
- Android系统信息与安全机制
- Android系统信息与安全机制
- 《Android群英传》读书笔记6.Android绘图机制与处理技巧
- Android群英传——第九章ActivityManager获取信息
- 《Android群英传》读书笔记1.Android体系与系统架构
- Android群英传读书笔记第六章(Android绘图机制与处理技巧)
- android异常:Consumer closed input channel or an error occurred. events
- NSTextAttachment富文本控件实现图文混排
- Manacher算法 with c++
- 将字符串循环左移右移
- PHP前端开发教程
- 《Android群英传》读书笔记(10)第九章:Android系统信息与安全机制
- ionic状态改变时动态(强制)刷新页面
- mtl_system_items_b表中的栏位与界面栏位对应
- VC++调用并编译静态库
- 配置mysql默认编码格式 && 解决Can't connect to local MySQL server through socket 问题
- 全屏右滑手势实现
- 关于tomcat服务器无法打开文件名为中文名的页面的问题
- Bulls and Cows 1807 7810 return "1A3B"
- Eclipse中配置javap命令