1

私はこのようなサービスを持っています (これは実際のサービスではなく、私の問題を説明するためのものです)。

public class UploadService {

    private BlockingQueue<UploadData> queue = null;

    private UploadInfoReceiver receiver = null;

    public void onStart(...) {
        queue = new LinkedBlockingQueue<UploadData>();
        (new Processor()).start();
        // creating and reigtering receiver
    }

    public void onDestroy() {
        queue.add(new ServiceDestroyedData());
        // unregistering the receiver
    }

    private class Processor extends Thread() {

        public void run() {
            while (true) {
                UploadData data = queue.take();

                if (data instanceof ServiceDestroyedData) {
                    return;
                }

                // processing data
            }
        }

    }

    private class UploadInfoReceiver extends BroadcastReceiver {

        public void onReceive(Context context, Intent intent) {
            queue.add(new UploadData(/* getting data from intent */));
        }

    }

}

そして、私の問題は、アプリで次のようなことをすると:

if (!isUploadServiceRunning()) {
    // start the Service
}

次に、サービスを開始しますが、アプリをバックグラウンドに移動してタスクマネージャー (android 4.2.2) を開き、アプリを強制終了すると、Android がサービスを再起動すると、まったく新しいインスタンスが作成されることがわかります。以前の Service インスタンスに対して onDestroy が呼び出されることはありません。また、以前のプロセッサ スレッドのインスタンスが実行されていないこともわかります。どうすればいいの?onDestroy が呼び出されない場合、Android はどのようにして私のスレッドを停止する必要があることを認識しますか?

回答ありがとうございます。

4

1 に答える 1

1

メニューから強制停止を選択すると、アプリのクラスローダーに接続されていることが判明したものはすべて、Android によって強制終了されます。kill -9Linux で考えてみてください。onDestroy メソッドへの適切なコールバックはなく、システムはすべてを終了します。

今あなたのサービスのために:

while(true)本当に絶対に使用しないでください。それは即座にバッテリーを殺し、とにかく99%の時間は何もしません.

すでにレシーバーを使用している場合は、whileそこにロジックを配置するだけで、アップロードが完了したら次のアップロードを呼び出すことができます。ループは絶対に必要ありません。

于 2013-10-13T08:47:33.743 に答える