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;  
    }  
}  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM