2012-09-27 55 views
2

我已經創建了一個Android應用程序與AIDL遠程服務基於此教程:與遠程服務的Android應用程序

http://www.anddev.org/remote_service_tutorial-t8127.html

我改變了服務,以便它打印計數器的logcat表明它在跑。

class Task implements Runnable { 
    private final ResultReceiver receiver2; 

    public Task(ResultReceiver receiver) { 
     receiver2 = receiver; 
    } 

    public void run() { 

     while (true) { 
      ++counter; 

      Bundle b = new Bundle(); 
      try { 
       System.out.println("Server counter: " + counter); 
       // get some data or something 
       b.putInt("results", counter); 
       receiver2.send(STATUS_FINISHED, b); 
      } catch (Exception e) { 
       b.putString(Intent.EXTRA_TEXT, e.toString()); 
       receiver2.send(STATUS_ERROR, b); 
      } 

      try { 
       Thread.sleep(1000); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
      // serviceHandler.postDelayed(this, 1000L); 
      Log.i(getClass().getSimpleName(), "Incrementing counter in the run method"); 
     } 
    } 
} 

我想檢查服務是否繼續運行,即使主應用程序停止,所以我用finish()來「殺死」活動。即使活動消失,計數器仍然可以打印到logcat。

當我重新打開應用程序。我單擊開始按鈕並使用下面的代碼來檢查服務是否正在運行(這是,我可以看到計數器在logcat中運行)但它不存在在運行服務的列表中。

我想知道服務是否正在運行。如果它正在運行,那麼我想將該應用程序綁定到現有服務。如果不是,應該開始一項新的服務。

public class ServiceTools private static String LOG_TAG = ServiceTools.class.getName();

public static boolean isServiceRunning(Context context, String serviceClassName) { 
    final ActivityManager manager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); 
    for (RunningServiceInfo info : manager.getRunningServices(Integer.MAX_VALUE)) { 
     String name = info.service.getClassName(); 
     if (name.equals(serviceClassName)) { 
      return true; 
     } 
    } 
    return false; 
} 

}

現在我的問題:爲什麼我的服務沒有正在運行的服務?我可以綁定到服務,即使它不在正在運行的服務集合中?

回答

2

我只想說,在我的設備上,您所說的告訴服務是否正在運行的方法不起作用(它總會返回錯誤)。我知道,我爲我的一項服務嘗試了同樣的事情。在getRunningServices()方法的文檔中聲明它實際上不應該被應用程序使用。

另外,基於你的故事得出的結論是,該服務可能會停止/殺死,但其進程仍然存在,因爲它啓動的線程仍然存在並正在工作。所以你可能是對的,服務停止了,但線程繼續存在。你是否在你的代碼中使用stopService()或unbindService()?如果在綁定之前沒有對startService()進行調用,則在所有客戶端調用unbindService()之後,服務將停止...

相關問題