16

私はAndroidの設計上の考慮事項について言及しています:AsyncTask vs Service(IntentService?)

議論によると、AsyncTaskはアクティビティに緊密に「バインド」されているため、適していません。

そこで、Thread(AsyncTaskとThreadが同じカテゴリに属していると仮定して)を起動し、無限実行ループを作成して、次のテストを実行しました。

  • ホーム画面が表示されるまで、戻るソフトキーを押し続けて、アプリケーションを終了します。スレッドはまだ実行中です。
  • [アプリの管理]->[アプリ]->[強制停止]に移動して、アプリケーションを強制終了します。スレッドが停止しています。

ですから、からに変更した後はThreadServiceアプリを終了または強制Service終了した後も存続することを期待しています。


Intent intent = new Intent(this, SyncWithCloudService.class);
startService(intent);

public class SyncWithCloudService extends IntentService {
    public SyncWithCloudService() {
        super("SyncWithCloudService");
    }

    @Override
    protected void onHandleIntent(Intent intent) {
        int i = 0;
        while (true) {
            Log.i("CHEOK", "Service i is " + (i++));
            try {
                Thread.sleep(1000);
            } catch (InterruptedException ex) {
                Log.i("CHEOK", "", ex);
            }
        }
    }
}

    // Doesn't matter whether I use "android:process" or not.
    <service 
        android:name="com.xxx.xml.SyncWithCloudService" 
        android:process=".my_process" >
    </service>

しかし、私の発見は、

  • ホーム画面が表示されるまで、戻るソフトキーを押し続けて、アプリケーションを終了します。サービスはまだ実行中です。
  • [アプリの管理]->[アプリ]->[強制停止]に移動して、アプリケーションを強制終了します。サービスを停止します。

Serviceとの動作はThread同じようです。では、なぜService代わりに使用する必要があるのThreadですか?見逃したことはありますか?Serviceアプリを強制終了した後も、実行を続けると思いましたか?

4

5 に答える 5

12

いいえ。アプリケーションを強制終了すると、サービスの実行が停止します。アプリケーションを強制終了すると、アプリケーションのすべてのコンポーネント(アクティビティ、サービスなど)が強制終了されます。

一般に、スレッドとサービスの動作は似ています。ただし、アクティビティからスレッドを開始してからアクティビティをシャットダウンすると(つまり、アプリケーションを終了すると)、最終的にAndroidはプロセスにアクティブなコンポーネントがないことに気付きます(Androidはスレッドをアクティブなコンポーネントとして認識しないため)そしてそれはあなたのプロセスを殺すだけで、それによってスレッドを殺します。

ただし、サービスを実行している場合、Androidはサービスが実行されていることを認識し、サービスをすぐに強制終了しません。ただし、Androidが「使用中」でない場合、Androidがサービスプロセスを強制終了する可能性はあります。

于 2012-06-28T09:29:01.633 に答える
4

実際、実装できるサービスにはさまざまな種類があります。Serviceの代わりにa を使用しIntentServiceます。を確認する必要があり、アクティビティが終了してもサービスをバックグラウンドで実行し続けることができSTART_STICKYますSTART_NOT_STICKYAndroid サービスSTART_REDELIVER_INTENT

于 2014-02-14T07:20:46.217 に答える
1

を使用してstartService()います。はService、コードが完了するまで、または Android が強制終了する必要があると判断するまで実行されます。バインドされたサービスを検索します。に電話するActivity.onDestroy()必要がありますunbindService()

于 2012-06-28T09:25:41.117 に答える