メインスレッドを使用する必要がある場合は、いいえ。ただし、サービスの使用方法に応じて、メイン スレッドで実行しないようにする方法がいくつかあります。
onStartCommand から実行する場合: エグゼキューター (別のスレッド) でプロセスを実行するか、これを自動的に実行するインテント サービスで使用します。onbind を使用している場合: 同じことが当てはまり、バックグラウンドで実行しますが、intentservice はこれを支援できません。その場合は、その方法をご案内しますのでお知らせください。
アップデート:
デバイスの開発オプションで、すべての ANR の表示を有効にするのに役立つ開発オプションが 1 つあります。これにより、サービスのメインスレッドを強制終了するのではなくブロックすると、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;
}
}
この例では、WrappingService が新しいクラスで、YourServiceClass がデバッグしようとしているサービスです。
次に、onHandleIntent でサービスの onStartCommand メソッドを呼び出します。これは、サービス クラスが final でない限り機能するはずです。
これで、少なくともこれをデバッグできます。