Android系统信息获取

1.Android获取系统信息

     在android中,我们要获取系统信息,主要通过两个方面获取

android.os.Build
SystemProperty

android.os.Build

Build.BOARD (主板)    The name of the underlying board, like "goldfish".
Build.BOOTLOADER(boos 版本)    The system bootloader version number.
Build.BRAND(android系统定制商)    The consumer-visible brand with which the product/hardware will be associated, if any.
Build.TIME (编译时间)
Build.VERSION.SDK_INT (版本号)
Build.MODEL (版本)
Build.SUPPORTED_ABIS (cpu指令集)
Build.DEVICE (设备参数)
Build.ID (修订版本列表)
...

SystemProperty

可以使用 System.getProperty("") 进行获取

os.version  os版本
  os.name     os名称
  os.arch     os架构
  user.home     home属性
  user.name     name属性
  user.dir      dir属性
  java.class.path   java class 路径
  java.class.version   java class 版本
  java.version   java版本
  java.home    java home属性

实例代码:

 1 private String getHandSetInfo(){
 2 String handSetInfo=
 3 "手机型号:" + android.os.Build.MODEL +
 4 ",SDK版本:" + android.os.Build.VERSION.SDK +
 5 ",系统版本:" + android.os.Build.VERSION.RELEASE+
 6 ",软件版本:"+getAppVersionName(MainActivity.this);
 7 return handSetInfo;
 8 }
 9 //获取当前版本号
10 private String getAppVersionName(Context context) {
11 String versionName = "";
12 try {
13 PackageManager packageManager = context.getPackageManager();
14 PackageInfo packageInfo = packageManager.getPackageInfo("cn.testgethandsetinfo", 0);
15 versionName = packageInfo.versionName;
16 if (TextUtils.isEmpty(versionName)) {
17 return "";
18 }
19 } catch (Exception e) {
20 e.printStackTrace();
21 }
22 return versionName;
23 } 

2.packageManage获取APK应用内信息

      我们的minifest.xml清单文件,我们可以在其中声明activity、service、provider、receiver、权限等信息。其实我们可以理解minifest文件是我们的app的配置管理信息,然后呢,packagemanager就是负责管理我们所有的已安装app。

activityinfo

activityinfo 是对minifest中的所有<activity> </activity>的管理,我们可以获取name, icon, lable等信息

serviceinfo

serviceinfo 是对minifest中所有的<service> </service>的管理。

applicationinfo

applicationinfo 是对<application> </application>之间的信息。

packageinfo

packageinfo 包含了所有的activity, service ...等信息

resolveinfo

resolveinfo 封装的是<intent> 信息的上一层信息,所以它可以返回 serviceinfo, activityinfo 等包含<intent>的信息。它常常用来帮我们找到那些包含特定intent条件的信息,如果播放功能应用、分享等等。

PackageManager 针对于上面的这些管理类,提供了一些常用的方法,我们可以轻松的获取需要的管理类。

  • getPackageManager 通过调用这个方法获取packagemanager对象
  • getApplicationInfo 以applicationinfo的形式返回指定包名的applicationinfo
  • getApplicationIcon 返回置顶包名的icon
  • getInstalledApplications 以applicationinfo的形式返回所有安装的应用
  • getInstalledPackages 以packageinfo的形式返回所有安装的应用
  • queryIntentActivities 返回指定intent的resolveinfo对象,activity集合
  • queryIntentService 返回指定intent的resolveinfo对象, service集合
  • resolveActivity 返回指定intent的activity
  • resolveService 返回指定intent的service

区分应用类型

ApplicationInfo app;
app.flags & ApplicationInfo.FLAG_SYSTEM
  • 如果当前应用的flags & ApplicationInfo.FLAG_SYSTEM != 0 则为系统应用
  • 如果当前应用的flags & ApplicationInfo.FLAG_SYSTEM <= 0 则为第三方应用
  • 特殊情况下,当系统应用升级后,也将变成第三方应用,flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP != 0
  • 如果当前应用的flags & ApplicationInfo.FLAG_EXTERNAL_STORAGE != 0 则为安装在sdcard上的应用

实例代码:

 1  public void queryAppInfo() {  
 2         PackageManager pm = this.getPackageManager(); // 获得PackageManager对象  
 3         Intent mainIntent = new Intent(Intent.ACTION_MAIN, null);  
 4         mainIntent.addCategory(Intent.CATEGORY_LAUNCHER);  
 5         // 通过查询,获得所有ResolveInfo对象.  
 6         List<ResolveInfo> resolveInfos = pm  
 7                 .queryIntentActivities(mainIntent, PackageManager.MATCH_DEFAULT_ONLY);  
 8         // 调用系统排序 , 根据name排序  
 9         // 该排序很重要,否则只能显示系统应用,而不能列出第三方应用程序  
10         Collections.sort(resolveInfos,new ResolveInfo.DisplayNameComparator(pm));  
11         if (mlistAppInfo != null) {  
12             mlistAppInfo.clear();  
13             for (ResolveInfo reInfo : resolveInfos) {  
14                 String activityName = reInfo.activityInfo.name; // 获得该应用程序的启动Activity的name  
15                 String pkgName = reInfo.activityInfo.packageName; // 获得应用程序的包名  
16                 String appLabel = (String) reInfo.loadLabel(pm); // 获得应用程序的Label  
17                 Drawable icon = reInfo.loadIcon(pm); // 获得应用程序图标  
18                 // 为应用程序的启动Activity 准备Intent  
19                 Intent launchIntent = new Intent();  
20                 launchIntent.setComponent(new ComponentName(pkgName,  
21                         activityName));  
22                 // 创建一个AppInfo对象,并赋值  
23                 AppInfo appInfo = new AppInfo();  
24                 appInfo.setAppLabel(appLabel);  
25                 appInfo.setPkgName(pkgName);  
26                 appInfo.setAppIcon(icon);  
27                 appInfo.setIntent(launchIntent);  
28                 mlistAppInfo.add(appInfo); // 添加至列表中  
29                 System.out.println(appLabel + " activityName---" + activityName  
30                         + " pkgName---" + pkgName);  
31             }  
32         }  
33     }  

3.ActivityManager获取正在运行的应用的信息

  • ActivityManager.MemoryInfo

在MemoryInfo中,有几个我们很有用的字段:

availMem : 系统可用内存
totalMem : 总内存
threshold : 低内存的阀值,用来区分低内存
lowMemory : 是否处于低内存
  • RunningAppProcessInfo

正在运行进程的信息, processName:进程名, pid: 进程pid ,uid: 进程uid, pkgList: 该进程下的所有包

  • RunningServiceInfo

封装了正在运行的服务信息, activeSince: 第一次被激活的时间, foreground: 服务是否在后台执行

实例代码:

import java.util.ArrayList;  
import java.util.Collections;  
import java.util.HashMap;  
import java.util.List;  
import java.util.Map;  
  
import android.app.Activity;  
import android.app.ActivityManager;  
import android.content.Context;  
import android.content.Intent;  
import android.content.pm.ApplicationInfo;  
import android.content.pm.PackageInfo;  
import android.content.pm.PackageManager;  
import android.content.pm.PackageManager.NameNotFoundException;  
import android.os.Bundle;  
import android.util.Log;  
import android.view.View;  
import android.widget.AdapterView;  
import android.widget.ListView;  
import android.widget.TextView;  
import android.widget.AdapterView.OnItemClickListener;  
  
public class BrowseRunningAppActivity extends Activity {  
  
    private static String TAG = "BrowseRunningAppActivity";  
  
    private ListView listview = null;  
  
    private List<RunningAppInfo> mlistAppInfo = null;  
    private TextView tvInfo = null ;  
      
    private PackageManager pm;  
  
    @Override  
    public void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.browse_app_list);  
  
        listview = (ListView) findViewById(R.id.listviewApp);  
        tvInfo = (TextView)findViewById(R.id.tvInfo) ;  
          
        mlistAppInfo = new ArrayList<RunningAppInfo>();  
  
        // 查询某一特定进程的所有应用程序  
        Intent intent = getIntent();  
        //是否查询某一特定pid的应用程序  
        int pid = intent.getIntExtra("EXTRA_PROCESS_ID", -1);  
          
        if ( pid != -1) {  
            //某一特定经常里所有正在运行的应用程序  
            mlistAppInfo =querySpecailPIDRunningAppInfo(intent, pid);  
        }  
        else{  
            // 查询所有正在运行的应用程序信息: 包括他们所在的进程id和进程名  
            tvInfo.setText("所有正在运行的应用程序有-------");  
            mlistAppInfo = queryAllRunningAppInfo();   
        }  
        BrowseRunningAppAdapter browseAppAdapter = new BrowseRunningAppAdapter(this, mlistAppInfo);  
        listview.setAdapter(browseAppAdapter);  
    }  
  
    // 查询所有正在运行的应用程序信息: 包括他们所在的进程id和进程名  
    // 这儿我直接获取了系统里安装的所有应用程序,然后根据报名pkgname过滤获取所有真正运行的应用程序  
    private List<RunningAppInfo> queryAllRunningAppInfo() {  
        pm = this.getPackageManager();  
        // 查询所有已经安装的应用程序  
        List<ApplicationInfo> listAppcations = pm.getInstalledApplications(PackageManager.GET_UNINSTALLED_PACKAGES);  
        Collections.sort(listAppcations,new ApplicationInfo.DisplayNameComparator(pm));// 排序  
  
        // 保存所有正在运行的包名 以及它所在的进程信息  
        Map<String, ActivityManager.RunningAppProcessInfo> pgkProcessAppMap = new HashMap<String, ActivityManager.RunningAppProcessInfo>();  
  
        ActivityManager mActivityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);  
        // 通过调用ActivityManager的getRunningAppProcesses()方法获得系统里所有正在运行的进程  
        List<ActivityManager.RunningAppProcessInfo> appProcessList = mActivityManager  
                .getRunningAppProcesses();  
  
        for (ActivityManager.RunningAppProcessInfo appProcess : appProcessList) {  
            int pid = appProcess.pid; // pid  
            String processName = appProcess.processName; // 进程名  
            Log.i(TAG, "processName: " + processName + "  pid: " + pid);  
  
            String[] pkgNameList = appProcess.pkgList; // 获得运行在该进程里的所有应用程序包  
  
            // 输出所有应用程序的包名  
            for (int i = 0; i < pkgNameList.length; i++) {  
                String pkgName = pkgNameList[i];  
                Log.i(TAG, "packageName " + pkgName + " at index " + i+ " in process " + pid);  
                // 加入至map对象里  
                pgkProcessAppMap.put(pkgName, appProcess);  
            }  
        }  
        // 保存所有正在运行的应用程序信息  
        List<RunningAppInfo> runningAppInfos = new ArrayList<RunningAppInfo>(); // 保存过滤查到的AppInfo  
  
        for (ApplicationInfo app : listAppcations) {  
            // 如果该包名存在 则构造一个RunningAppInfo对象  
            if (pgkProcessAppMap.containsKey(app.packageName)) {  
                // 获得该packageName的 pid 和 processName  
                int pid = pgkProcessAppMap.get(app.packageName).pid;  
                String processName = pgkProcessAppMap.get(app.packageName).processName;  
                runningAppInfos.add(getAppInfo(app, pid, processName));  
            }  
        }  
  
        return runningAppInfos;  
  
    }  
    // 某一特定经常里所有正在运行的应用程序  
    private List<RunningAppInfo> querySpecailPIDRunningAppInfo(Intent intent , int pid) {  
  
  
        String[] pkgNameList = intent.getStringArrayExtra("EXTRA_PKGNAMELIST");  
        String processName = intent.getStringExtra("EXTRA_PROCESS_NAME");  
          
        //update ui  
        tvInfo.setText("进程id为"+pid +" 运行的应用程序共有  :  "+pkgNameList.length);  
                  
        pm = this.getPackageManager();  
      
        // 保存所有正在运行的应用程序信息  
        List<RunningAppInfo> runningAppInfos = new ArrayList<RunningAppInfo>(); // 保存过滤查到的AppInfo  
  
        for(int i = 0 ; i<pkgNameList.length ;i++){  
           //根据包名查询特定的ApplicationInfo对象  
           ApplicationInfo appInfo;  
          try {  
            appInfo = pm.getApplicationInfo(pkgNameList[i], 0);  
            runningAppInfos.add(getAppInfo(appInfo, pid, processName));  
          }  
          catch (NameNotFoundException e) {  
            // TODO Auto-generated catch block  
            e.printStackTrace();  
          }  // 0代表没有任何标记;  
        }  
        return runningAppInfos ;  
    }  
      
      
    // 构造一个RunningAppInfo对象 ,并赋值  
    private RunningAppInfo getAppInfo(ApplicationInfo app, int pid, String processName) {  
        RunningAppInfo appInfo = new RunningAppInfo();  
        appInfo.setAppLabel((String) app.loadLabel(pm));  
        appInfo.setAppIcon(app.loadIcon(pm));  
        appInfo.setPkgName(app.packageName);  
  
        appInfo.setPid(pid);  
        appInfo.setProcessName(processName);  
  
        return appInfo;  
    }  
}  

 

posted @ 2017-03-16 09:38  点滴之水  阅读(6082)  评论(0编辑  收藏  举报