Androidで実行中のアプリケーションを取得する-----ActivityManager.RunningApProcessiInfo類の詳細



                                                                                                              転載は出典を明記してください.http://blog.csdn.net/qinjuning
 
          
             
                 今日は引き続きActivityManagerの使用について説明します.前節の勉強を通して、ActivityManagerを利用してシステムを取得する方法を学びました.
      実行中のプロセス.本論文で説明する知識点は、これらのプロセス情報を利用して、システムで実行されているアプリケーションと各プロセスで実行されているアプリケーションを取得することです.
     使う知識ポイントには、Package Managerの使用も含まれています.読者は私の前に書いたブログ「Package Managerの使用」を読みます.
           
              すべてのアプリケーションは独立したプロセスで実行されますが、リソースを節約するために、またはこれらのアプリケーションは、ある共同作業を完了するために実行されます.
      プロセスで実行されるかもしれません.
                                                                 
 
 
  知識点の紹介:
   
        ActivityManager.RunningApProcessiInfo類
         説明:実行中のプロセス情報をカプセル化しました.
         通常のフィールド:
                   要点   pid    プロセスID
                   要点   uid    プロセスがあるユーザID
                   String   processNameプロセス名は、デフォルトではパケット名またはandroid:process="属性で指定されています.
                   String[]   pkgList      このプロセスで実行されるすべてのアプリケーションのパッケージ名
 
      ActivityManager.RunningApProcessiInfoの詳細については、を参照してください.
   
   Package Manger類
       説明:アプリケーション情報の操作をカプセル化しました.
        アプリケーション情報を取得する方法は以下の通りです.
       public abstract Apple Info  getApple Info(String) package Name,int flags)
          パラメータ:package nameパッケージ名
                       flags   このアプリInfoはこのフラグです.通常は定数0を直接付与すればいいです.
          機能:Apple Infoオブジェクトを返す
 
   Package Mangerの詳細については、 
 
 デモ説明:
 
            私たちはActivityManagerを利用して、実行中のプロセス情報をすべて取得しました.つまり、各プロセスで実行中のアプリケーションパッケージ名を取得しました.
     これらのパッケージ名から、Package Manager類が提供するメソッドを直接呼び出して、これらのアプリケーションの情報を取得することができます.
 
           いくつかの資源ファイルは貼らないで、直接主な工事のロジックを貼り付けました.ここで注意したいのですが、私達は一回ですべてのアプリケーション情報を取得しました.
     アプリケーションはフィルタリングを行い、私たちが必要なオブジェクトを得る.読者はPackage Manager類が提供する方法を使って、全パッケージ名を巡回して、
     しかし、このほうが効率が低いです.
 
      スクリーンショットは以下の通りです
                     プロセスをクリックした後                                          あるプロセスが実行するアプリケーションの情報を表示します.              実行中のプロセス情報:
                        Android中获取正在运行的应用程序-----ActivityManager.RunningAppProcessInfo类详解_第1张图片       Android中获取正在运行的应用程序-----ActivityManager.RunningAppProcessInfo类详解_第2张图片         Android中获取正在运行的应用程序-----ActivityManager.RunningAppProcessInfo类详解_第3张图片
   
   アプリケーションを実行していると表示されるプロジェクトコードは以下の通りです.
 
package com.qin.ammp;

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;
	}
}
         このセクションの紹介を通して、AndroidシステムのSettingsモジュールは基本的にアプリケーションの機能を完成しました.
  でも、主軸線はもう計画されていますので、みなさんもよく味わってください.
 
 
       コードのダウンロード先:http://download.csdn.net/detail/qinjuning/3839045