3

ブレークポイントを設定し、サービスのメイン スレッドがそこで停止すると、数秒後 (約 5 秒) にサービス プロセス全体が Android によってシャットダウンされます。また、これが発生すると、ほとんど操作できなくなります (式を評価できない、現在のコンテキスト変数を参照できないなど)。サービスのメイン スレッドでない場合は問題ありません。デバッグは正常に機能します。

サービスは、アクティビティを通じて開始されます。

それで、Androidがそれを殺さずにサービスのメインスレッドをデバッグする方法はありますか?

前もって感謝します!

4

1 に答える 1

5

メインスレッドを使用する必要がある場合は、いいえ。ただし、サービスの使用方法に応じて、メイン スレッドで実行しないようにする方法がいくつかあります。

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 でない限り機能するはずです。

これで、少なくともこれをデバッグできます。

于 2013-07-08T14:33:52.510 に答える