1. ホーム
  2. アンドロイド

[解決済み】ログアウト時にアクティビティ履歴をクリアすると、「戻る」ボタンでログイン中のみのアクティビティを開けなくなる。

2022-04-16 04:32:11

質問

私のアプリケーションのすべてのアクティビティは、閲覧するためにユーザーがログインしている必要があります。ユーザーはほぼすべてのアクティビティからログアウトすることができます。これは、アプリケーションの要件です。ユーザーがログアウトした場合、どの時点でも、ユーザーをLogin Activity . このとき、このアクティビティを履歴スタックの一番下に置き、"back" ボタンを押すと、ユーザーがAndroidのホーム画面に戻るようにしたいのです。

この質問はいくつかの異なる場所で見られ、どれも似たような答え(ここに概要を記す)でしたが、ここで提起してフィードバックを集めたいと思います。

ログインアクティビティに Intent フラグを FLAG_ACTIVITY_CLEAR_TOP これは、ドキュメントに概説されているように見えるが、履歴スタックの一番下にログインアクティビティを配置し、ユーザーが以前に見たログインアクティビティにナビゲートして戻るのを防ぐという私の目標を達成することはできない。私はまた、使用しようとしました android:launchMode="singleTop" をマニフェスト内のログイン アクティビティに追加しましたが、これも私の目標を達成できませんでした (いずれにしても効果はないようです)。

私は、履歴スタックをクリアするか、以前に開いたアクティビティをすべて終了させる必要があると思います。

ひとつの方法として、各アクティビティーの onCreate ログイン状態をチェックし finish() ログインしていない場合 私はこのオプションが好きではありません。なぜなら、戻るボタンはまだ使用可能で、アクティビティが閉じると戻るようにナビゲートするからです。

次のオプションは LinkedList への参照は、どこからでも静的にアクセスできます (おそらく弱い参照を使用)。ログアウト時にこのリストにアクセスし、以前に開かれたすべてのアクティビティを繰り返し実行します。 finish() を1つ1つ確認します。この方法は、近々実装し始めると思います。

むしろ、いくつかの Intent フラグのトリックを使用することで、これを達成することができます。上記の2つの方法のどちらかを使わなくても、私のアプリケーションの要求を満たすことができるとわかったら、この上ない幸せです。

を使用して達成する方法はありますか? Intent またはマニフェストの設定か、あるいは私の第二の選択肢である LinkedList が最適なのでしょうか?それとも、私が完全に見落としている別のオプションがあるのでしょうか?

解決方法は?

私は、より堅牢な別のアプローチを提案することができますIMHO。 基本的には、ログイン状態を維持する必要があるすべてのアクティビティにログアウトメッセージをブロードキャストする必要があります。そこで sendBroadcast を設置し BroadcastReceiver をすべてのActvitiesで使用します。 このようなものです。

/** on your logout method:**/
Intent broadcastIntent = new Intent();
broadcastIntent.setAction("com.package.ACTION_LOGOUT");
sendBroadcast(broadcastIntent);

受信者(確保されたActivity)です。

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    /**snip **/
    IntentFilter intentFilter = new IntentFilter();
    intentFilter.addAction("com.package.ACTION_LOGOUT");
    registerReceiver(new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            Log.d("onReceive","Logout in progress");
            //At this point you should start the login activity and finish this one
            finish();
        }
    }, intentFilter);
    //** snip **//
}