- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
如果我设置断点并且服务主线程停在那里,整个服务进程将在几秒后(大约 5 秒)被 Android 关闭。发生这种情况时几乎也无法进行任何操作(无法计算表达式,无法查看当前上下文变量等)。如果不是Service主线程,那就没问题,调试正常。
服务通过 Activity 启动。
那么,有没有办法在 Android 不杀死它的情况下调试服务主线程?
提前致谢!
最佳答案
如果您必须使用主线程,则不可以。也就是说,有几种方法可以使其不在主线程上运行,具体取决于您使用该服务的方式。
如果您从 onStartCommand 运行:在执行程序中运行您的进程(在不同的线程中)或在 Intent 服务中使用,它将自动为您执行此操作。如果您使用的是 onbind:同样适用,在后台运行它,但 intentservice 不能帮助你。如果是这种情况,请告诉我,我将向您展示如何执行此操作。
更新:
可能有一种开发选项可以帮助您,在您设备的开发选项中,启用显示所有 ANR。当您阻止服务主线程而不是仅仅杀死它时,这可能会显示 ARN(此选项存在于我运行 android 4.1.2 的手机上)
如果这不起作用,您可以使用此 hack:
由于您无法更改该服务本身的代码,您可以尝试以下有点困惑和骇人听闻的代码。不能保证它会起作用,但可能值得一试。
创建一个扩展 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 方法。只要服务类不是最终的,这就应该有效。
现在你至少可以调试它了。
关于android - 调试服务主线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16938371/
有人可以向我澄清主线 DHT 规范中的声明吗? Upon inserting the first node into its routing table and when starting up th
我正在尝试使用 USB 小工具驱动程序使嵌入式设备作为 MTP 设备工作。 我知道 Android 从大容量存储设备切换到 MTP 设备已经有一段时间了,并且找到了 source code for M
我是一名优秀的程序员,十分优秀!