2010-10-24 102 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

所以这已经覆盖了扑翼......但他们的回答实际上并没有说“怎么做。上面的回答说“写在你的代码”的东西不适合我。

运行您的应用程序。按下照片中的按钮,选择你的背景进程,为我同步。我不知道同步是否仅适用于同步适配器..