2013年3月16日 星期六

說說,檢查Service是正在運行。


首先,我們先來看來自這裡所使用的方法:

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;                
}

這是一個檢測服務是否啟動的方法。

我們試著來分項看看:

  1. 這裡輸入了兩個參數:
    1. context:這是一個Context物件,用於呼叫getSystemService()方法;而getSystemService()方法的使用,會得到一個Object物件,透過轉型來獲得對應的物件,而該物件轉型的參考文件可參閱這裡,我們將要轉成ActivityManager物件。
    2. PackageName:這是用來比目前正在使用的Service物件列表中有沒有相同的package 名稱;當然,在RunningServiceInfo這個物件之中,我們也可以找到getClassName()方法,會返回一個完整路徑(String)。關於RunningServiceInfo的詳細方法,參考這裡
  2. 然後我們來看看裡面的內容:
    1. 首先會看到我們需要獲取一個服務,將其轉型成為ActivityManager,顧名思義,它是用來查詢系統中目前有註冊(正在運行)的特定內容,包括了getRunningTasks()、getRunningServices()或是getRunningAppProcesses()...等等
    2. 透過ActivityManager,我們獲得目前正在運行中的服務列表,以List<ActivityManager.RunningServiceInfo>承裝內容。
    3. 透過foreach的方法,一個一個查詢是不是有相同的package name,如果有則break,跳出foreach並且return true值。
    4. 這裡面嘗試處理了SecurityException,當查找失敗的時候會拋出這個錯誤。
最後我實作了一個簡單的App
會列出現在系統正在運行的Service的class 完整名稱,下載在這裡

















沒有留言:

張貼留言

你好,我是小書,如果文章內容有錯誤,或是看到有建議以及任何感想時,歡迎提出分享,我們一起學習一起努力。

追蹤者