Android 에서 실행 중인 프로그램 과 시스템 서 비 스 를 받 는 방법
모든 프로그램 은 독립 된 프로 세 스 에서 실 행 됩 니 다.그러나 자원 을 절약 하거나 이 프로그램 들 은 공동 작업 을 완성 하기 위해 서 입 니 다.
한 프로 세 스에 서 실 행 될 수도 있 습 니 다.
지식 포인트 소개:
Activity Manager.RunningAppProcessInfo 클래스
설명:실행 중인 프로 세 스 정 보 를 봉 인 했 습 니 다.
상용 필드:
int pid 프로 세 스 ID
int uid 프로 세 스 가 있 는 사용자 ID
String processName 프로 세 스 이름,기본 값 은 패키지 이름 또는 android:process="속성 으로 지 정 됩 니 다.
String [ ] pkgList 이 프로 세 스에 서 실행 되 는 모든 프로그램 패키지 이름
데모 설명:
저 희 는 Activity Manager 를 이용 하여 실행 중인 모든 프로 세 스 정 보 를 얻 은 후에 모든 프로 세 스 에서 실행 중인 프로그램 패키지 이름(pkgname)을 얻 었 습 니 다.그러면 이 패키지 이름(pkgname)을 통 해 PackageManager 류 가 제공 하 는 방법 을 직접 호출 하여 이 프로그램의 정 보 를 얻 을 수 있 습 니 다.
일부 자원 파일 은 붙 이지 않 고 주 공정 논 리 를 직접 붙 였 다.주의해 야 할 것 은 여기 서 우 리 는 모든 프로그램 정 보 를 한꺼번에 얻 은 다음 에 이 프로그램 들 을 여과 하여 우리 가 필요 로 하 는 대상 을 얻 을 수 있 습 니 다.독자 들 은 패키지 관리자 클래스 가 제공 하 는 방법 을 사용 하여 모든 패키지 이름(pkgname)을 순환 적 으로 옮 겨 다 닐 수 있 지만 효율 이 낮 습 니 다.
캡 처 는 다음 과 같 습 니 다.
어떤 프로 세 스 를 클릭 하면
프로 세 스 가 실행 중인 프로그램 정보,실행 중인 모든 프로 세 스 정 보 를 봅 니 다.
프로그램 을 실행 중인 프로젝트 코드 를 다음 과 같이 표시 합 니 다.
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
기능:실행 중인 모든 서 비 스 를 되 돌려 줍 니 다.
인자: 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 파일 에서
2.시스템 권한,이 건 할 말 이 없습니다.
캡 처 는 다음 과 같 습 니 다.
주 공정 논 리 는 다음 과 같다.
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());
}
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Bitrise에서 배포 어플리케이션 설정 테스트하기이 글은 Bitrise 광고 달력의 23일째 글입니다. 자체 또는 당사 등에서 Bitrise 구축 서비스를 사용합니다. 그나저나 며칠 전 Bitrise User Group Meetup #3에서 아래 슬라이드를 발표했...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.