Android中獲取正在執行的服務-------ActivityManager.RunningServiceInfo的使用(三)
轉自:http://blog.csdn.net/qinjuning/article/details/7015313
關於PackageManager和ActivityManager的使用 ,自己也寫了一些DEMO 了,基本上寫的線路參考了Settings模組下的應用程式,大家如果真正的有所興趣,建議大家看看原始碼,不過醜化說在前面,我自己也沒怎麼看過這方面的原始碼,只在需要的時候,才跑過去翻翻。
今天,在耐著最後一點性子,寫下了這篇博文,基本上完成了整個應用程式功能模組的介紹,大家也在此係列上慢慢擴充。
ActivityManager.RunningServiceInfo類: 封裝了正在執行的服務資訊
獲取系統裡所有真正執行的服務是通過呼叫ActivityManager方法來得到的,具體方法如下:
List<ActivityManager.RunningServiceInfo> getRunningServices (int maxNum)
功能:返回所有正在執行的服務
引數: maxNum 代表我們希望返回的服務數目大小,一般給個稍大的值即可, 例如,50 。
ActivityManager.RunningServiceInfo 類
常用欄位:
long activeSince 服務第一次被啟用的時間, 包括啟動和繫結方式
int clientCount 如果該Service是通過Bind方法方式連線,則clientCount代表了service連線客戶端的數目
int crashCount 服務執行期間,出現當機的次數
boolean foreground 若為true,則該服務在後臺執行
int pid 如果不為0,表示該service所在的程式ID號( PS:為0的話我也不清楚 - - 求指點)
int uid 使用者ID 類似於Linux的使用者許可權,例如root等
String process 程式名,預設是包名或者由屬性android:process指定
ComponentName service 獲得該Service的元件資訊 包含了pkgname / servicename資訊
PackageManger類
說明: 封裝了對應用程式資訊的操作
獲得應用程式資訊的的方法如下:
public abstractApplicationInfo getApplicationInfo(String packageName, int flags)
引數:packagename 包名
flags 該ApplicationInfo是此flags標記,通常可以直接賦予常數0即可
功能:返回ApplicationInfo物件
關於PackageManger更多資訊,請檢視<Android中獲取應用程式(包)的資訊-----PackageManager的使用(一)>
Task任務的使用,我也就不在贅述了,大家可以仔細看下SDK,在此推薦一篇部落格來幫助大家理解。
Demo說明:
我們獲取了系統里正在執行的服務資訊,包括包名,圖示,service類名等。為了達到Settings下應用程式模組中的
正在執行服務的效果,我們點選某一服務後,理論上來說是可以停止該服務的,但是由於許可權permissions不夠,可能報
SecurityException異常,導致應用程式發生異常。
關於許可權不夠的問題,可以分為兩種:
1、 在AndroidManifest.xml檔案中,為<activity/>或<service/>節點指定android:permission屬性時,在其他程式中操作時,
需要 宣告該permission許可權 。 具體可以參考下面這篇文章:
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 + "\n" + " service啟動的時間值:" + activeSince
- + " 客戶端繫結數目:" + clientCount + "\n" + "該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());
- }
- }
- }
程式碼下載地址:http://download.csdn.net/detail/qinjuning/3846097
終於完成了這幾塊功能的介紹,這些功能的具體使用都挺類似的,最重要的是看你有沒有耐心去把他們做出來。
作為一個小小程式設計師,我還是一步一步來做吧。。
相關文章
- MySQL 5.7獲取指定執行緒正在執行SQL的執行計劃資訊MySql執行緒
- 獲取任務的執行結果
- Android中後臺的服務和多執行緒Android執行緒
- 終止expdp正在執行中的匯出任務
- 列舉mysql正在執行中的全部事務MySql
- Windows10系統停止正在執行服務的方法Windows
- Android中獲取正在執行的應用程式-----ActivityManager.RunningAppProcessInfo類詳解(二)AndroidAPP
- Linux Shell獲取正在執行指令碼的絕對路徑Linux指令碼
- MySQL 如何獲取執行中的Queries資訊?MySql
- 在Linux中,如何使用shell指令碼判斷某個服務是否正在執行?Linux指令碼
- net6 類中獲取服務
- Android中執行緒的使用Android執行緒
- Java多執行緒——獲取多個執行緒任務執行完的時間Java執行緒
- 為正在執行的 Docker 容器重啟策略,以提高服務的可用性Docker
- android如何獲取listview中的任意行資料AndroidView
- 獲取執行計劃的方法
- 獲取oracle正在處於等待狀態的sql語句的執行計劃的語句OracleSQL
- 查詢oracle正在執行的SQL和事務OracleSQL
- Android判斷服務是否在執行Android
- 【Java面試】如何中斷一個正在執行的執行緒?Java面試執行緒
- android應用開發—獲取當前執行的services列表Android
- Android 原始碼分析(三)安卓中的執行緒Android原始碼安卓執行緒
- Laravel 獲取執行的sql語句LaravelSQL
- Oracle獲取執行計劃的方法Oracle
- 獲取SQL執行計劃的方式:SQL
- Java中命名執行器服務執行緒和執行緒池Java執行緒
- 服務執行過程中磁碟壞道引起的思考
- 停掉正在執行的JOB
- Python中獲取執行緒返回值的常用方法!Python執行緒
- 查詢某個會話正在執行的事務會話
- Android中獲取應用程式(包)的資訊-----PackageManager的使用(一)AndroidPackage
- Android中獲取應用程式(包)的大小-----PackageManager的使用(二)AndroidPackage
- 在Docker中,如何停止所有正在執行的容器?Docker
- 阿里雲簡訊服務的使用-----獲取簡訊驗證碼阿里
- 如何獲取真實的執行計劃
- 獲取執行計劃的6種方法
- Binder系列6—獲取服務(getService)
- 【java】【多執行緒】獲取和設定執行緒名字、獲取執行緒物件(3)Java執行緒物件