web-dev-qa-db-ja.com

android finish()メソッドがアプリをメモリからクリアしない

アクティビティがあり、finish()メソッドを呼び出しましたが、アクティビティがメモリからクリアされていません。

Finish()を呼び出した後、メソッドonDestroy()が正常に実行されたことがわかります(そして、そこにあるすべての変数とデータをクリアします)。

メモリから消去する必要がありますか、またはその方法Androidの動作?アクティビティのライフサイクルが終了したことを理解しています。

また、アプリをメモリに保持して、ユーザーが2回目に使用したときにアプリがより速く実行される場合、どのようなオブジェクトをメモリに残して再利用できますか?私が正しく理解していれば、onDestroyのすべてをクリアすると思います。

26
Daniel Benedykt

Androidは、ユーザーがアプリを再起動したい場合に備えてプロセスを維持します。これにより、起動フェーズが速くなります。プロセスは何も実行せず、メモリを解放する必要がある場合、プロセスは強制終了されます。心配しないでください:)

33
Romain Guy

最善の方法は、最初にfinish()を使用し、その後System.exit(0)を使用して静的変数をクリアすることです。それはあなたにいくつかの空き領域を与えます。

多くのアプリケーションは、作業プロセスと変数を残して、私を怒らせます。メモリを使用してから30分後、タスクマネージャを実行する必要があります-Lvl 2メモリをクリアします

私のアプリで3年以上試してみた問題を引き起こしているのは本当ではありません。 Exit()の使用後にクラッシュしたり再起動したりしない

27
Tefel

使ってみてください

System.exit(0);

11
Zahid

OnDestroy()が呼び出されると、アクティビティが終了します。限目。

そうは言っても、アプリケーションに割り当てられたプロセス(したがってアドレス空間)は、アプリケーションの別の部分(別のアクティビティまたはサービス)でまだ使用されている可能性があります。プロセスが空で、OSがまだそれを再利用していない可能性もあります。インスタントではありません。

詳細については、Process Lifecycleドキュメントを参照してください。
http://developer.Android.com/reference/Android/app/Activity.html#ProcessLifecycle

いずれにしても、アクティビティが再起動された場合は、onCreate()から始めて、起動シーケンス全体をもう一度繰り返す必要があります。暗黙的に再利用できるものがあると想定しないでください。

6
Trevor Johns

サブアクティビティからアプリケーションを閉じる必要がある場合は、次の方法で作成することをお勧めします。1)アクティビティAからアクティビティBをstartActivityForResult(intent、REQUEST_CODE);として呼び出す。

Intent intent = new Intent()
            .setClass(ActivityA.this, ActivityB.class);
            startActivityForResult(intent, REQUEST_CODE);

2)アクティビティAでメソッドを追加する必要があります:

protected void onActivityResult(int requestCode, int resultCode,
        Intent data) {
    if (requestCode == REQUEST_CODE) {
        if (resultCode == RESULT_CLOSE_APPLICATION) {
            this.finish();
        }
    }
}

3)アクティビティBでの通話終了:

this.setResult(RESULT_CLOSE_APPLICATION);
this.finish();
4

Google I/O 2008からの this プレゼンテーションによると、Finishshouldもプロセスを強制終了させるが、私はこれをテストする簡単なアプリケーションAndroid 1.5はテストしません。

Romainが言ったように(偶然にもAndroidのUIツールキットエンジニアです)、プロセスは何もせずただそこに座っているだけなので、心配する必要はありません。

1
Frank

簡単な解決策として、以下を使用してアプリを強制終了できます。

Android.os.Process.killProcess(Android.os.Process.myPid());

しかし、Androidメモリ管理システムの動作に反するため、商用アプリにはお勧めしません。

1
Rab Ross