2013-03-21 17 views
16

シナリオ:

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

質問:

  1. は、アプリケーション(そのプロセスを)閉じます各アクティビティの仕上がりを()を呼び出すことによって、すべての活動を終えたのだろうか?
  2. 変数の値は、すべてのアクティビティが終了しても(閉じられていても)どのように保持されますか?
  3. アプリケーションを終了するのにSystem.exit(10)に続いてProcess.killProcess(Process.myPid())をコールするのは公正でしょうか?

更新:

どのように私は、アプリケーション(HomeActivityのバックプレス)の終了時にアプリケーション定数をクリアすることができますか?

+1

という定数を設定していないので、それらをクリアするのはどうですか? – m0skit0

+0

シンプル: 'System.exit()'を呼ばないでください。 HomeActivityが終了したら変数をクリアするだけです。 –

答えて

14

1)いいえ、Androidはこれを保証しません。プロセスを終了するかどうかは、OSによって異なります。

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

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

finish()に電話すると、これはActivityインスタンスがガベージコレクトされたことを意味しません。あなたはを閉じることをAndroidに指示しています。Activity(もう表示しないでください)。 Androidがプロセスを終了させる(そしてDVMを終了する)か、インスタンスがガベージコレクションされるまで、まだ存在します。

Androidは、アプリケーションのコンポーネントのいずれか を実行する必要があるプロセスを開始し、それはもはや必要 場合や、システムが他のアプリケーションのためのメモリを回復しなければならないのですとき、そのプロセスをシャットダウンしません。

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

Quotes source

+1

また、アンドロイドがいつプロセスを終了するかを決めるところもあります –

+0

@nidhi_adigaこれは私が言ったことです:* "プロセスを終了するかどうかはOSによって決まります" * – m0skit0

+0

* "OS "*私はAndroid ofcを意味します。提供されたリンクと説明については – m0skit0

5

仕上げ()各活動の応用(そのプロセス)を閉じますを呼び出すことにより、すべての活動を終えたのだろうか?

いいえ、そうしてはいけません。これは、アクティビティがアプリの唯一のコンポーネントではないためです。ブロードキャスト受信者はUIなしでも実行できます。可能であれば、アプリケーションプロセスを実行し続けることで、Androidはユーザーがアプリケーションをすぐに開くことができるようになり、アプリケーションインスタンスを再作成する必要がなくなります。

あなたや他のアプリが明示的にそれを強制終了した場合や、システムがリソースを解放するためにシステムを強制終了した場合にのみ、プロセスは終了されます。

変数の値は、すべてのアクティビティが終了(クローズ)されてもどのように保持されますか?

あなたの変数は、シングルトンモデルに従うApplicationクラスにあるため、アプリケーションプロセス全体が終了するまで値は保持されます。

さらに、finish()は、hereのように、デコンストラクタではないonDestroy()のみを呼び出します。だから、あなたのインスタンスがそれを破壊する必要があると感じるまで、あるいはあなたのプロセスが殺されるまで、あなたのインスタンスはまだ周囲に保持されているので、アクティビティ変数はfinishが呼び出された後も持続することがあります。

アプリケーションを終了するには、System.exit(10)の後にProcess.killProcess(Process.myPid())を呼び出すのは公正でしょうか?

これはアプリを強制終了しますが、お勧めしません。さまざまな理由からthis質問を参照してください。

+1

+1。 – Raghunandan

0

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

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

アプリケーションを終了するには、System.exit(10)の後にProcess.killProcess(Process.myPid())を使用しないでください。

実際にアプリケーションを終了しないと考えるべきです。これは、Androidアプリが通常動作する方法ではありません。あなたの更新のための

2

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

あなたHomeActivityの内側とコールsuper.onBackPressed(前onBackPressedオーバーライド)は、すべての変数をクリア。あなたは、アプリケーションのサブクラスの内側に文字列のためのセッターを持っている場合:あなたはクリアするたくさんの状態を持っている場合

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

あなたはウィッヒの方法を記述し、すべてのフィールドをリセットし、それを呼び出すことができますの

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

をもちろん、これらのフィールドには、finalまたはstatic final

関連する問題