1

内の任意の時点でログアウトできるアプリケーションがいくつかあります。たとえば、ログインしてからブラウジングします。アクションバーまたはメニューボタンを使用してログアウトします。その時点でfinish()を呼び出すことができますが、最後のアクティビティがポップされます。ユーザーをホームアクティビティに移動しても、スタックはメモリに残ります。残りのスタックを破壊する方法はありますか?

4

2 に答える 2

3

これを行う最も簡単な方法は、スタックをクリアしてホームまたは最初のアクティビティに戻し、アプリを終了するように指示する識別子を渡すことです。例えば:

public class ActivityOne extends Activity {
    public static final String FINISH_THIS = "FINISH_THIS";
    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        if(intent.hasExtra(FINISH_THIS)) {
            finish();
        }
    }
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if(getIntent().hasExtra(FINISH_THIS)) {
            finish();
        }
    }
}

public class ActivityTwo extends Activity {
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        if(item.getItemId() == R.id.logout) {
            Intent intent = new Intent(this, ActivityOne.class);
            intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            intent.putExtra(ActivityOne.FINISH_THIS, true);
            startActivity(intent);
        }
        return true;
    }
}

ActivityOne がスタックのルートであり、ActivityTwo がユーザーがログアウトするオプションを選択した場所である場合、ActivityOne に戻るインテントを開始すると、バックスタックが削除されます。ログアウト時にアプリを終了させたい場合は、FINISH_THIS で行ったように追加を渡して、ルート/ホーム アクティビティが終了することを知らせることができます。

これを行う別の方法は、 を呼び出すsetResult(FINISH_THIS)前に FINISH_THIS が int 識別子である場所を呼び出すことfinish()です。次に、スタック内の他のすべてのアクティビティで、結果をオーバーライドonActivityResultしてチェックし、そのアクティビティを終了する必要があるかどうかを確認します。その場合は、結果を再度設定し、それをそのまま渡し続けます。

最初に概説したインテント メソッドを使用することは、結果をデイジー チェーン接続することに依存しないため、スタックをクリアするための推奨される方法ですが、両方のオプションが十分に機能します。

于 2012-07-03T16:59:50.117 に答える
0

それを行うための迅速で汚い方法は、onResume でまだログインしていることを確認し、ログインしていない場合は終了します。そうすれば、彼らが反撃した場合、それを開こうとするときに各アクティビティを閉じます。これにより、アクティビティが閉じられることが予想されるときに、誰かがアプリ マネージャーを使用してアクティビティを再入力することもできなくなります。

もう 1 つのアイデアはAndroid: Clear the back stack です。

于 2012-07-03T15:57:50.740 に答える