不,如果你必须使用主线程。也就是说,有几种方法可以使它不在主线程上运行,具体取决于您使用服务的方式。
如果您从 onStartCommand 运行:在执行程序中运行您的进程(在不同的线程中)或在意图服务中使用它会自动为您执行此操作。如果您使用的是 onbind:同样适用,在后台运行它,但 intentservice 无法帮助您。如果是这种情况,请告诉我,我将向您展示如何执行此操作。
更新:
可能有一种开发选项可以帮助您在设备的开发选项中启用显示所有 ANR。当您阻止服务主线程而不是杀死它时,这可能会显示一个 ARN(此选项存在于我运行 android 4.1.2 的手机上)
如果这不起作用,你可以使用这个黑客:
由于您无法更改该服务本身的代码,您可以尝试以下有点凌乱和骇人听闻的方法。不能保证它会起作用,但它可能值得一试。
创建一个扩展 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;
}
}
Run Code Online (Sandbox Code Playgroud)
在此示例中, WrappingService 是您的新类,而 YourServiceClass 是您尝试调试的服务。
然后在您的 onHandleIntent 中调用服务 onStartCommand 方法。只要服务类不是最终的,这应该有效。
现在您至少可以调试它。
| 归档时间: |
|
| 查看次数: |
909 次 |
| 最近记录: |