2010-10-24 105 views
45

我已經寫了服務與遠程接口,並把它安裝到PC的Eclipse AVD。我有一個客戶端測試工具,用於啓動和調用服務中的方法。起初我有一個控制類和活動,這是我現在已經刪除安裝服務,使該服務的清單看起來像:調試服務

<?xml version="1.0" encoding="utf-8"?> 
<manifest 
xmlns:android="http://schemas.android.com/apk/res/android" 
package="com.myname.gridservice" 
android:versionCode="1" 
android:versionName="1.0"> 
<application 
    android:icon="@drawable/icon" 
    android:label="@string/app_name" 
    android:debuggable="true"> 
    <service 
     android:enabled="true" 
     android:debuggable="true" 
     android:name="OverlayService"> 
     <intent-filter> 
      <action android:name="com.myname.OverlayService.SERVICE"/> 
      <action android:name="com.myname.gridservice.IRemoteInterface" /> 
     </intent-filter> 
    </service> 
</application> 
</manifest> 

所以沒有活動標記。

當我從Eclipse中的調試圖標啓動它時,控制檯告訴我它正在安裝apk(它是),但它不會顯示爲調試線程,並且不會觸發斷點,儘管服務的行爲是好的,只要客戶看到它。如果我包裹服務標籤中都有一個相關的類並啓動該活動代碼,然後我就可以調試它

是否有可能調試服務,而不在活動包裝呢?

+1

在另一個問題,你說你知道答案。只需自己回答問題,兩天後你也可以接受。 – Janusz 2010-10-30 09:19:16

+0

答案就在這裏 http://stackoverflow.com/questions/5379129/debugging-not-working-in-a-service-class-what-c​​an-cause-this-issue – 2012-01-25 09:53:49

回答

6

我覺得應該用編程android.os.Debug.waitForDebugger()來實現;

72

您可以通過以下四個步驟做:

第一:在服務的第一個有趣的方法(我用創建):

/* (non-Javadoc)  
* @see android.app.Service#onCreate() 
*/ 
@Override 
public void onCreate() { 
super.onCreate(); 
//whatever else you have to to here... 
android.os.Debug.waitForDebugger(); // this line is key 
} 

第二:waitForDebuggerCommand後設置斷點。

三:通過在Eclipse中調試按鈕啓動應用。 (你或許應該迄今爲止已刪除從清單中的主發射活動)

末:啓動亞行和運行命令來啓動服務:

  • cd $PLATFORM_TOOLS
  • adb shell
  • am startservice -n com.google.android.apps.gtalkservice/com.google.android.gtalkservice.service.GTalkService
+1

很好,我只是意識到,雖然這在我的模擬設備上正常工作,但在我的htc啓動4g時完全不起作用。似乎命令從cmd行啓動服務工作,但調試器從不附加。不知道爲什麼...我已經恢復到啓動之前建議的主要活動... – 2011-06-30 15:48:51

+2

請注意,「waitForDebugger」這一行並不意味着該服務將在該行上中斷。它只是意味着「開始觀察斷點並停止*」 – 2013-09-24 14:29:35

+3

警告 - 這也意味着如果真正沒有連接調試器,則該語句後面的代碼將不會執行。 – 2014-07-10 15:26:08

18

只是確保你不要忘了這行代碼在代碼中,釋放您的APK。 如果你嘗試沒有調試器中運行你的應用程序下面的行會被卡住。

android.os.Debug.waitForDebugger(); 

你也可以使用以下方法來確定是否調試器連接:

android.os.Debug.isDebuggerConnected(); //Determine if a debugger is currently attached. 
2

這工作Android Studio中。我猜想Eclipse中可能有類似的方法。

  1. 運行項目在調試模式下
  2. 調試器附加到您的服務流程
13

enter image description here

所以這已經覆蓋了撲翼......但他們的回答實際上並沒有說「怎麼做。上面的回答說「寫在你的代碼」的東西不適合我。

運行您的應用程序。按下照片中的按鈕,選擇你的背景進程,爲我同步。我不知道同步是否僅適用於同步適配器..