首先,我們先來看來自這裡所使用的方法:
public static boolean isServiceStarted(Context context,String PackageName){
boolean isStarted =false;
try{
int intGetTastCounter = 1000;
ActivityManager mActivityManager =
(ActivityManager)context.getSystemService(Context.ACTIVITY_SERVICE);
List<ActivityManager.RunningServiceInfo> mRunningService =
mActivityManager.getRunningServices(intGetTastCounter);
for (ActivityManager.RunningServiceInfo amService : mRunningService){
if(0 == amService.service.getPackageName().compareTo(PackageName)){
isStarted = true;
break;
}
}
}catch(SecurityException e){
e.printStackTrace();
}
return isStarted;
}
這是一個檢測服務是否啟動的方法。
我們試著來分項看看:
- 這裡輸入了兩個參數:
- context:這是一個Context物件,用於呼叫getSystemService()方法;而getSystemService()方法的使用,會得到一個Object物件,透過轉型來獲得對應的物件,而該物件轉型的參考文件可參閱這裡,我們將要轉成ActivityManager物件。
- PackageName:這是用來比目前正在使用的Service物件列表中有沒有相同的package 名稱;當然,在RunningServiceInfo這個物件之中,我們也可以找到getClassName()方法,會返回一個完整路徑(String)。關於RunningServiceInfo的詳細方法,參考這裡。
- 然後我們來看看裡面的內容:
- 首先會看到我們需要獲取一個服務,將其轉型成為ActivityManager,顧名思義,它是用來查詢系統中目前有註冊(正在運行)的特定內容,包括了getRunningTasks()、getRunningServices()或是getRunningAppProcesses()...等等。
- 透過ActivityManager,我們獲得目前正在運行中的服務列表,以List<ActivityManager.RunningServiceInfo>承裝內容。
- 透過foreach的方法,一個一個查詢是不是有相同的package name,如果有則break,跳出foreach並且return true值。
- 這裡面嘗試處理了SecurityException,當查找失敗的時候會拋出這個錯誤。
最後我實作了一個簡單的App
會列出現在系統正在運行的Service的class 完整名稱,下載在這裡。
沒有留言:
張貼留言
你好,我是小書,如果文章內容有錯誤,或是看到有建議以及任何感想時,歡迎提出分享,我們一起學習一起努力。