3

アクティビティが終了する前 ( が呼び出されたとき)、いくつかの値OnDestroyを に保存しています。 intSharedPreferences

しかし、私が気付いたのは、値が保存されるのに約1秒かかることですが、アプリはそれを待ってからActivity.

Wait殺される前に何かできることはありますか?

これが私の例です:

@Override
public void onDestroy(){

    SharedPreferences.Editor editor = sharedPreferences.edit();
    editor.putInt("finalXPos", finalX);
    editor.putInt("finalYPos", finalY);
    editor.commit();

    super.onDestroy();
    removeView();
}

======================>> 編集 <<======================

私は間違いを犯し、これはあると言いましたActivityが、そうではありません。サービスonDestroyのを呼び出していますが、残念ながらそこをオーバーライドする方法はありません...onPause

4

2 に答える 2

10

docsに従って、メソッドに依存しonDestroy()てデータを永続化しないでください。onPause()代わりに使用してください。

注:このメソッドがデータを保存する場所として呼び出されるとは考えないでください。

たとえば、アクティビティがコンテンツ プロバイダのデータを編集している場合、それらの編集は、 here ではなく、onPause() または onSaveInstanceState(Bundle) でコミットする必要があります。このメソッドは通常、アクティビティに関連付けられているスレッドなどのリソースを解放するために実装されます。これにより、アプリケーションの残りの部分がまだ実行されている間に、破棄されたアクティビティがそのようなリソースを残さないようにすることができます。

システムがこのメソッド (または他のメソッド) を呼び出さずにアクティビティのホスティング プロセスを単純に強制終了する状況があるため、プロセスがなくなった後も残り続けることを意図したことを行うために使用しないでください。

また、データをより高速に非同期で保存し、処理する戻り値がまったくないため、メソッドapply()の代わりにcommit()メソッドを使用することもできます。SharedPreferences.Editor


編集:わかりましたService。問題は、Activityバックグラウンドで実行し続けるため、寿命がはるかに長くなる可能性があることです。そのためonDestroy()、戻るボタンでアプリを閉じても、サービスが呼び出されるまでに非常に長い時間がかかることがあります。

あなたのアプリがどのように機能するのかわかりませんが、いくつか提案できます。

  1. SharedPreferencesユーザーがアプリを閉じたときに作業したい場合は、そのメソッドをActivityor;に移動します。
  2. 内部では、 メソッドを使用してActivity#onPause()を破壊できます。(以下の例を参照)。ServicestopService()
  3. あなたServiceが何らかの作業を行うことになっており、この作業が完了した後に を変更する必要がある場合はSharedPreferences、 を使用してみてくださいIntentService。ただし、一度IntentServiceに実行できるのは 1 つだけです。FIFO キューで実行されます。
  4. を使用したくない場合は、レギュラー内からIntentService呼び出して停止して破棄することもできます。stopSelf()Service

仕上げの例Service:

@Override
protected void onPause() {
    super.onPause();
    stopService(new Intent(context, YourService.class));
}

詳細についてIntentServiceは、このチュートリアルを参照してください。Serviceライフサイクルの詳細については、このリンクを参照してください。

于 2015-09-15T02:51:36.200 に答える