16

シナリオ:

私の Android アプリケーションには 4 つのアクティビティがあります。A、B、C、D としましょう。アプリには、アプリケーションのグローバルな状態を維持するためにクラスConstants.javaを拡張するクラスが 1 つあります。ApplicationConstants クラスには、アプリのすべての定数変数があります。活動の流れはこんな感じA-->B-->C-->Dです。アクティビティ A から戻るボタンが押されたときに、アクティビティ A を終了してアプリケーションを閉じる finish() メソッドを呼び出しています。その後、すべてのアプリからアプリを開くとConstants.java、最後の起動から値が保持される変数があります。アクティビティAから(バックプレスで)System.exit(10)続けているときは、同じことは起こりません。Process.killProcess(Process.myPid())

質問:

  1. 各アクティビティのfinish()を呼び出してすべてのアクティビティを終了すると、アプリケーション(そのプロセス)が閉じますか?
  2. すべてのアクティビティが終了 (終了) した場合でも、変数の値はどのように保持されますか?
  3. アプリケーションを終了するためSystem.exit(10)に呼び出すのは公平ですか?Process.killProcess(Process.myPid())

アップデート:

アプリケーションの終了時にアプリケーション定数をクリアするにはどうすればよいですか (HomeActivity の Back キーを押します)?

4

4 に答える 4

14

1)いいえ、Androidはそのことを保証しません。プロセスを終了するかどうかを決定するのはOS次第です。

2)ActivityインスタンスはまだDalvikVMに存在するため。Androidでは、各プロセスに個別のDalvikVMがあります。

各プロセスには独自の仮想マシン(VM)があるため、アプリケーションのコードは他のアプリケーションから分離して実行されます。

これを呼び出すとき、インスタンスがガベージコレクションされるfinish()ことを意味するわけではありません。ActivityあなたはAndroidにあなたが閉じたいと言っていますActivity(もうそれを見せないでください)。Androidがプロセスを強制終了する(したがってDVMを終了する)か、インスタンスがガベージコレクションされるまで、このファイルは引き続き存在します。

Androidは、アプリケーションのコンポーネントのいずれかを実行する必要があるときにプロセスを開始し、不要になったとき、またはシステムが他のアプリケーションのメモリを回復する必要があるときにプロセスをシャットダウンします。

3)非常に強い理由がない限り、私はそうしません。経験則として、フォーカスを失ったときにアプリケーションをリセットする必要があるアプリケーションの状態に何かがない限り、Androidにアプリケーションを強制終了するタイミングを処理させる必要があります。

引用元

于 2013-03-21T10:05:38.047 に答える
6

各アクティビティのfinish()を呼び出してすべてのアクティビティを終了すると、アプリケーション(そのプロセス)が閉じますか?

いいえ、そうすべきではありません。これは、アクティビティがアプリの唯一のコンポーネントではないためです。Services、BroadcastReceivers は UI なしでも実行できます。可能な限りアプリケーション プロセスを実行し続けることで、アプリケーション インスタンスを再作成する必要がないため、Android はユーザーがアプリを再度開いたときの応答を高速化したり、サービスなどの起動を高速化します。

プロセスは、ユーザーまたは別のアプリが明示的に強制終了した場合、またはシステムがプロセスを強制終了してリソースを解放した場合にのみ終了します。

すべてのアクティビティが終了 (終了) した場合でも、変数の値はどのように保持されますか?

変数は Application クラスにあり、Singleton モデルに従うため、アプリ プロセス全体が強制終了されるまで値が保持されます。

さらに、こちらで説明されているように、デコンストラクターではないfinish()のみを呼び出します。そのため、Android がインスタンスを破棄する必要があると判断するか、プロセスが強制終了されるまで、インスタンスは引き続き保持されるため、finish が呼び出された後も Activity 変数でさえ存続する可能性があります。onDestroy()

アプリケーションを終了するために System.exit(10) に続いて Process.killProcess(Process.myPid()) を呼び出すのは公平ですか?

これによりアプリが強制終了されますが、推奨されません。そのさまざまな理由については、この質問を参照してください。

于 2013-03-21T10:07:50.513 に答える
2

あなたのアップデートのために:

How can I clear the application constants on exit of the application(Back press of the HomeActivity)?

HomeActivity 内で onBackPressed をオーバーライドし、super.onBackPressed() を呼び出す前に、すべての変数をクリアします。Application サブクラス内に String のセッターがある場合:

@Override
public void onBackPressed() {
    getApplication().setMyString(null);
    super.onBackPressed();
}

クリアする状態がたくさんある場合は、すべてのフィールドをリセットして呼び出すメソッドを作成できます。

@Override
public void onBackPressed() {
    getApplication().clearAllMyFields();
    super.onBackPressed();
}

もちろん、これらのフィールドをfinalまたはとしてマークする必要はありませんstatic final

于 2013-06-02T08:21:01.793 に答える
0

Android は、プロセス メモリを再利用する必要があるまでプロセスを保持します。そうすれば、ユーザーがすぐにアプリケーションに戻った場合、アプリケーションはより速く表示されます。

この値は、アプリケーションが強制終了されるまで保持されます。

アプリケーションを終了するために System.exit(10) に続いて Process.killProcess(Process.myPid()) を使用すべきではありませんか?

アプリケーションを終了しないことを本当に考えるべきです。これは、通常の Android アプリの動作ではありません。

于 2013-03-21T10:09:21.947 に答える