- 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示例类似,不再贴出来了。