调试服务主线程

时间:2013-06-05 11:10:16

标签: android debugging service

如果我设置了断点并且服务主线程停在那里,那么几秒钟后(大约5秒)Android会关闭整个服务进程。当发生这种情况时,几乎不可能进行任何操作(无法计算表达式,无法查看当前上下文变量等)。如果它不是服务主线程,那么没有问题,调试工作正常。

该服务是通过活动启动的。

那么,有没有办法在没有Android杀死它的情况下调试服务主线程?

提前致谢!

1 个答案:

答案 0 :(得分:4)

不,如果你必须使用主线程。也就是说有几种方法可以让它不在主线程上运行,具体取决于你如何使用该服务。

如果你从onStartCommand运行: 在执行程序(在不同的线程中)运行您的进程或在intent服务中使用它将自动为您执行此操作。 如果您使用onbind: 同样适用,在后台运行它,但intentservice无法帮助您。如果是这种情况,请告诉我,我会告诉你如何做到这一点。

更新

可能有一个开发选项可以帮助您在设备的开发选项中启用显示所有ANR。当你阻止服务主线程而不是仅仅杀死它时,这可能会显示一个ARN(运行android 4.1.2的手机上存在此选项)

如果这不起作用,你可以使用这个黑客:

由于您无法更改该服务本身的代码,您可以尝试以下有点混乱和hackish。不能保证它会起作用,但它可能值得一试。

创建一个扩展IntentService的新服务。在onCreate中创建一个包装服务,扩展您要调试的服务。像这样。将其保存为变量并在其上调用所有生命周期方法。除了onStartCommand

mWrappedService = new YourServiceClass() {

    {
            attachBaseContext(WrappingService.this);
    }

    public IBinder onBind(Intent intent) {
        return super.onBind(intent);
    }

    @Override
    public Context getBaseContext() {
        return WrappingService.this;
    }        
}

在此示例中,WrappingService是您的新类,YourServiceClass是您尝试调试的服务。

然后在你的onHandleIntent中调用服务onStartCommand方法。只要服务类不是最终的,这就应该有效。

现在你至少可以调试它。