web-dev-qa-db-ja.com

すべてのアクティビティでアプリケーションを強制終了する方法は?

可能性のある複製:
アプリケーションの終了-それは眉をひそめていますか?

アプリケーションが必要とする限りSharedPreferencesに保存されている機密データを削除する必要があるため、ユーザーにアプリケーションを終了するオプションを提供したい。

ユーザーが終了するとすぐに、SharedPreferencesのパスワードを消去し、もちろんアプリケーションのすべてのアクティビティを閉じる必要があります(既知のパスワードなしで実行することは意味がありません-クラッシュします)。

どうやってやるの?

System.exit(0)およびfinish()は、現在のアクティビティのみを終了します-役に立たない。タスクマネージャーアプリがあることは知っています。あれはどうやっているの?アプリケーション全体を殺すことができます...

54
Nils

Finish()メソッドを使用すると、プロセスは完全には閉じられず、まだバックグラウンドで動作しています。

メインアクティビティでこのコードを使用してください(すべてのアクティビティまたはサブアクティビティで使用しないでください)。

@Override
public void onBackPressed() {

    Android.os.Process.killProcess(Android.os.Process.myPid());
    // This above line close correctly
}
100
Thirumalvalavan

正解です。finish()を呼び出すと、アプリケーション全体ではなく、現在のアクティビティのみが終了します。ただし、これには回避策があります。

アクティビティを開始するたびに、startActivityForResult(...)を使用して開始します。アプリ全体を閉じたいときは、次のようなことができます:

_setResult(RESULT_CLOSE_ALL);
finish();
_

次に、すべてのアクティビティのonActivityResult(...)コールバックを定義して、アクティビティが_RESULT_CLOSE_ALL_の値で戻るときに、finish()も呼び出します。

_@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    switch(resultCode)
    {
    case RESULT_CLOSE_ALL:
        setResult(RESULT_CLOSE_ALL);
        finish();
    }
    super.onActivityResult(requestCode, resultCode, data);
}
_

これにより、カスケード効果によりすべてのアクティビティが閉じられます。

また、私は彼の提案でCommonsWareをサポートしています。パスワードを変数に保存して、アプリケーションが閉じられたときに破壊されるようにします。

37
mtmurdock

ユーザーが開いているすべてのアクティビティを終了する場合は、アプリの起動時に実行される最初のアクティビティ(この場合は「LoginActivity」)を読み込むボタンを押す必要があります。

Intent intent = new Intent(getApplicationContext(), LoginActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.putExtra("EXIT", true);
startActivity(intent);

上記のコードは、LoginActivityを除くすべてのアクティビティをクリアします。 LoginActivityは、ユーザーがプログラムを実行したときに最初に表示されるアクティビティです。次に、このコードをLoginActivityのonCreate内に配置して、「Exit」メッセージが渡されたときに自己破棄するタイミングを通知します。

    if (getIntent().getBooleanExtra("EXIT", false)) {
         finish();
    }

Androidプラットフォームからのこの質問に対する答えは、「終了ボタンを作成しないでください。ユーザーが不要になったアクティビティを終了すると、アクティビティマネージャは表示どおりにクリーンアップします。フィット。"

13
Eric Leschinski

アプリケーションが必要とする限り、SharesPreferencesに保存されます。

どうして?

ユーザーが終了するとすぐに、SharedPreferencesのパスワードを消去し、もちろんアプリケーションのすべてのアクティビティを閉じる必要があります(既知のパスワードなしで実行することは意味がありません-クラッシュします)。

さらに良い:SharedPreferencesにパスワードを入れないでください。静的データメンバーで保持します。データは、アプリ内のすべてのアクティビティが終了(たとえば、[戻る]ボタン)されるか、または破棄されると(たとえば、RAMホーム)。

なんらかの予防的な「フラッシュパスワード」が必要な場合は、静的データメンバーをnullに設定し、アクティビティにそのメンバーをチェックさせ、nullのときに適切なアクションを実行させます。

7
CommonsWare

onBackPressed()メソッドの使用:

_@Override
public void onBackPressed() {    
    Android.os.Process.killProcess(Android.os.Process.myPid());
}
_

またはfinish()メソッドを使用すると、次のようなものがあります

_//Password Error, I call function
    Quit();             


    protected void Quit() {
        super.finish();
    }
_

Super.finish()を使用して、スーパークラスのアクティビティを閉じます。

6
Jorgesys

Androidアプリケーションフレームワークについての私の理解は、これは特に許可されていないということです。アプリケーションに現在のアクティビティがなくなると、アプリケーションは自動的に閉じられます。アプリケーションシステムの意図された設計。

必要な種類の効果を得るには、startActivityForResult()を使用してさまざまなアクティビティを開始し、終了ボタンに、親アクティビティにfinish()を伝える結果を送り返すことができます。そのアクティビティはonDestroy()の一部として同じ結果を送信できます。これはメインアクティビティにカスケードして戻り、実行中のアクティビティがなくなるため、アプリが終了します。

3
tlayton