Android 에서 실행 중인 프로그램 과 시스템 서 비 스 를 받 는 방법

18910 단어 Android실행 중
Activity Manager.Running AppProcessInfo 클래스 와 실행 중인 프로그램 가 져 오기
모든 프로그램 은 독립 된 프로 세 스 에서 실 행 됩 니 다.그러나 자원 을 절약 하거나 이 프로그램 들 은 공동 작업 을 완성 하기 위해 서 입 니 다.
한 프로 세 스에 서 실 행 될 수도 있 습 니 다.
2016228174335726.gif (295×68)
 지식 포인트 소개:
Activity Manager.RunningAppProcessInfo 클래스
설명:실행 중인 프로 세 스 정 보 를 봉 인 했 습 니 다.
상용 필드:
int   pid    프로 세 스 ID
int   uid    프로 세 스 가 있 는 사용자 ID
String   processName 프로 세 스 이름,기본 값 은 패키지 이름 또는 android:process="속성 으로 지 정 됩 니 다.
String [ ]   pkgList      이 프로 세 스에 서 실행 되 는 모든 프로그램 패키지 이름
데모 설명:
저 희 는 Activity Manager 를 이용 하여 실행 중인 모든 프로 세 스 정 보 를 얻 은 후에 모든 프로 세 스 에서 실행 중인 프로그램 패키지 이름(pkgname)을 얻 었 습 니 다.그러면 이 패키지 이름(pkgname)을 통 해 PackageManager 류 가 제공 하 는 방법 을 직접 호출 하여 이 프로그램의 정 보 를 얻 을 수 있 습 니 다.
일부 자원 파일 은 붙 이지 않 고 주 공정 논 리 를 직접 붙 였 다.주의해 야 할 것 은 여기 서 우 리 는 모든 프로그램 정 보 를 한꺼번에 얻 은 다음 에 이 프로그램 들 을 여과 하여 우리 가 필요 로 하 는 대상 을 얻 을 수 있 습 니 다.독자 들 은 패키지 관리자 클래스 가 제공 하 는 방법 을 사용 하여 모든 패키지 이름(pkgname)을 순환 적 으로 옮 겨 다 닐 수 있 지만 효율 이 낮 습 니 다.
캡 처 는 다음 과 같 습 니 다.
어떤 프로 세 스 를 클릭 하면
2016228174354207.gif (323×347)
프로 세 스 가 실행 중인 프로그램 정보,실행 중인 모든 프로 세 스 정 보 를 봅 니 다.
2016228174412674.gif (329×297)
2016228174430158.gif (345×425)
프로그램 을 실행 중인 프로젝트 코드 를 다음 과 같이 표시 합 니 다.

 
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; 
  } 
} 
Activity Manager.Running ServiceInfo 클래스 에서 실행 중인 서 비 스 를 가 져 옵 니 다.
Activity Manager.Running ServiceInfo 클래스:  실행 중인 서비스 정 보 를 봉인 하 였 습 니 다.
 
시스템 에서 진정 으로 실행 되 는 모든 서 비 스 를 가 져 오 는 것 은 Activity Manager 방법 을 호출 하여 얻 을 수 있 습 니 다.구체 적 인 방법 은 다음 과 같 습 니 다.
 
List getRunningServices (int maxNum)
기능:실행 중인 모든 서 비 스 를 되 돌려 줍 니 다.
인자:   maxNum 은 우리 가 되 돌아 가 고 싶 은 서비스 수량 크기 를 대표 합 니 다.보통 조금 큰 값 을 주면 됩 니 다.예 를 들 어 50.
                              
Activity Manager.Running ServiceInfo 클래스
  상용 필드:
 
long   activeSince        서비스 가 처음으로 활성화 되 는 시간 은 시작 과 바 인 딩 방식 을 포함 합 니 다.
int      clientCount          이 Service 가 Bind 방법 으로 연결 된다 면 clientCount 는 service 연결 클 라 이언 트 의 수 를 대표 합 니 다.
int      crashCount          서비스 운행 기간 에 다운 이 발생 한 횟수
boolean   foreground   true 라면 이 서 비 스 는 배경 에서 실 행 됩 니 다.
int        pid                          0 이 아니라면 이 service 가 있 는 프로 세 스 ID 번호(PS:0 이면 저도 잘 모 르 겠 습 니 다-조언 요청)를 표시 합 니 다.
int        uid                          사용자 ID 는 루트 와 같은 Linux 사용자 권한 과 유사 합 니 다.                   
String   process                 프로 세 스 이름,기본 값 은 패키지 이름 또는 속성 android:process 에서 지정 합 니 다.
ComponentName  service          이 Service 의 구성 요소 정 보 를 가 져 오 는 것 은 pkgname/servicename 정 보 를 포함 합 니 다.
 
PackageManger 클래스
설명:응용 프로그램 정보 에 대한 조작 을 봉인 하 였 습 니 다.
응용 프로그램 정 보 를 얻 는 방법 은 다음 과 같다.
public abstractApplicationInfo  getApplicationInfo(String  packageName, int flags)
인자:packagename 패키지 이름
flags 이 applicationInfo 는 이 flags 태그 로 상수 0 을 직접 부여 하면 됩 니 다.
기능:ApplicationInfo 대상 되 돌리 기
데모 설명:
패키지 이름,아이콘,서비스 클래스 등 시스템 에서 실행 중인 서비스 정 보 를 가 져 왔 습 니 다.Settings 에서 응용 프로그램 모듈 에서 서 비 스 를 실행 하고 있 는 효 과 를 얻 기 위해 저 희 는 특정한 서 비 스 를 클릭 한 후에 이론 적 으로 이 서 비 스 를 중단 할 수 있 습 니 다.그러나 권한 permissions 가 부족 하기 때문에 Security Exception 이상 을 보고 하여 응용 프로그램 에 이상 이 생 길 수 있 습 니 다.
 
권한 이 부족 한 문제 에 대해 서 는 두 가지 로 나 눌 수 있 습 니 다.
1.AndroidManifest.xml 파일 에서또는노드 에 android:permission 속성 을 지정 할 때 다른 프로 세 스에 서 작업 할 때 이 permission 권한 을 설명 해 야 합 니 다.
2.시스템 권한,이 건 할 말 이 없습니다.
캡 처 는 다음 과 같 습 니 다.
2016228174507748.gif (320×480)
주 공정 논 리 는 다음 과 같다.

package com.qin.runservice; 
 
import java.util.ArrayList; 
import java.util.Collections; 
import java.util.Comparator; 
import java.util.List; 
 
import android.app.Activity; 
import android.app.ActivityManager; 
import android.app.AlertDialog; 
import android.app.Dialog; 
import android.content.ComponentName; 
import android.content.Context; 
import android.content.DialogInterface; 
import android.content.Intent; 
import android.content.pm.ApplicationInfo; 
import android.content.pm.PackageManager; 
import android.content.pm.PackageManager.NameNotFoundException; 
import android.os.Bundle; 
import android.os.Debug; 
import android.util.Log; 
import android.view.ContextMenu; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View; 
import android.view.ContextMenu.ContextMenuInfo; 
import android.widget.AdapterView; 
import android.widget.ListView; 
import android.widget.TextView; 
import android.widget.AdapterView.OnItemClickListener; 
 
public class BrowseRunningServiceActivity extends Activity implements 
    OnItemClickListener { 
 
  private static String TAG = "RunServiceInfo"; 
 
  private ActivityManager mActivityManager = null; 
  // ProcessInfo Model             
  private List<RunSericeModel> serviceInfoList = null; 
 
  private ListView listviewService; 
  private TextView tvTotalServiceNo; 
 
  public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
 
    setContentView(R.layout.browse_service_list); 
 
    listviewService = (ListView) findViewById(R.id.listviewService); 
    listviewService.setOnItemClickListener(this); 
 
    tvTotalServiceNo = (TextView) findViewById(R.id.tvTotalServiceNo); 
 
    //   ActivityManager      
    mActivityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); 
 
    //        Service   
    getRunningServiceInfo(); 
    //       
    Collections.sort(serviceInfoList, new comparatorServiceLable()); 
 
    System.out.println(serviceInfoList.size() + "-------------"); 
 
    //  ListView        
    BrowseRunningServiceAdapter mServiceInfoAdapter = new  
         BrowseRunningServiceAdapter(BrowseRunningServiceActivity.this, serviceInfoList); 
 
    listviewService.setAdapter(mServiceInfoAdapter); 
 
    tvTotalServiceNo.setText("           :" + serviceInfoList.size()); 
  } 
  //               
  private void getRunningServiceInfo() { 
 
    //       Service      
    int defaultNum = 20; 
    //     ActivityManager getRunningAppServicees()                 
    List<ActivityManager.RunningServiceInfo> runServiceList = mActivityManager 
        .getRunningServices(defaultNum); 
 
    System.out.println(runServiceList.size()); 
 
    // ServiceInfo Model             
    serviceInfoList = new ArrayList<RunSericeModel>(); 
 
    for (ActivityManager.RunningServiceInfo runServiceInfo : runServiceList) { 
 
      //   Service         
      int pid = runServiceInfo.pid; // service     ID  
      int uid = runServiceInfo.uid; //   ID    Linux     ,ID        root  
      //    ,          android:process   
      String processName = runServiceInfo.process;  
 
      //  Service        
      long activeSince = runServiceInfo.activeSince; 
 
      //    Service   Bind      , clientCount   service         
      int clientCount = runServiceInfo.clientCount; 
 
      //    Service         pkgname/servicename 
      ComponentName serviceCMP = runServiceInfo.service; 
      String serviceName = serviceCMP.getShortClassName(); // service     
      String pkgName = serviceCMP.getPackageName(); //    
 
      //   Log 
      Log.i(TAG, "    id :" + pid + "      :" + processName + "     uid:" 
          + uid + "
" + " service :" + activeSince + " :" + clientCount + "
" + " service :" + serviceName + " and " + pkgName); // service , PackageManager service , PackageManager mPackageManager = this.getPackageManager(); // PackagerManager ; try { // pkgName ApplicationInfo appInfo = mPackageManager.getApplicationInfo( pkgName, 0); RunSericeModel runService = new RunSericeModel(); runService.setAppIcon(appInfo.loadIcon(mPackageManager)); runService.setAppLabel(appInfo.loadLabel(mPackageManager) + ""); runService.setServiceName(serviceName); runService.setPkgName(pkgName); // service Intent intent = new Intent(); intent.setComponent(serviceCMP); runService.setIntent(intent); runService.setPid(pid); runService.setProcessName(processName); // serviceInfoList.add(runService); } catch (NameNotFoundException e) { // TODO Auto-generated catch block System.out.println("--------------------- error -------------"); e.printStackTrace(); } } } // @Override public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) { // TODO Auto-generated method stub final Intent stopserviceIntent = serviceInfoList.get(position) .getIntent(); new AlertDialog.Builder(BrowseRunningServiceActivity.this).setTitle( " ").setMessage( " , 。 。") .setPositiveButton(" ", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // TODO Auto-generated method stub // Service // , , SecurityException , try { stopService(stopserviceIntent); } catch (SecurityException sEx) { // System.out.println(" deny the permission"); new AlertDialog.Builder(BrowseRunningServiceActivity.this).setTitle( " ").setMessage(" , , Service").create().show(); } // // Service getRunningServiceInfo(); // Collections.sort(serviceInfoList, new comparatorServiceLable()); // ListView BrowseRunningServiceAdapter mServiceInfoAdapter = new BrowseRunningServiceAdapter( BrowseRunningServiceActivity.this, serviceInfoList); listviewService.setAdapter(mServiceInfoAdapter); tvTotalServiceNo.setText(" :" + serviceInfoList.size()); } }).setNegativeButton(" ", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // TODO Auto-generated method stub dialog.dismiss(); // } }).create().show(); } // AppLabel private class comparatorServiceLable implements Comparator<RunSericeModel> { @Override public int compare(RunSericeModel object1, RunSericeModel object2) { // TODO Auto-generated method stub return object1.getAppLabel().compareTo(object2.getAppLabel()); } } }

좋은 웹페이지 즐겨찾기