[解決済み】ログアウト時にアクティビティ履歴をクリアすると、「戻る」ボタンでログイン中のみのアクティビティを開けなくなる。
質問
私のアプリケーションのすべてのアクティビティは、閲覧するためにユーザーがログインしている必要があります。ユーザーはほぼすべてのアクティビティからログアウトすることができます。これは、アプリケーションの要件です。ユーザーがログアウトした場合、どの時点でも、ユーザーを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 **//
}
関連
-
[解決済み] シンボル 'context' を解決できない
-
[解決済み】AndroidのSSL接続でトラストアンカーが見つからない
-
[解決済み】Android Studio。adbバージョン」の結果を取得できない
-
[解決済み】Android 8:クリアテキストのHTTPトラフィックが許可されない
-
[解決済み] SDKの場所がandroid studioで見つからない
-
[解決済み] android.support.design.widget.FloatingActionButton クラスの展開に失敗しました。
-
[解決済み] Androidで履歴スタックをすべて消去し、新しいアクティビティを開始する
-
[解決済み] アンドロイド バックスタックをクリアする
-
[解決済み] Androidです。バックスタックから以前のアクティビティをすべて削除する
-
[解決済み] アンドロイド アクティビティスタックを消去する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Androidエミュレータのエラーメッセージ。"PANIC: Missing emulator engine program for 'x86' CPUS." (パニック: エミュレータ・エンジン・プログラムがありません)
-
[解決済み】起動アクティビティを特定できませんでした。デフォルトのアクティビティが見つかりませんでした
-
[解決済み】新しいAVDを作成すると、CPU/ABIフィールドに「システムイメージがインストールされていません」と表示される。
-
[解決済み】Build Tools リビジョン 23.0.1 の検索に失敗しました。
-
[解決済み】SDKの場所がandroid studioで見つからない。
-
[解決済み】android.content.res.Resources$NotFoundExceptionの取得:androidにリソースが存在する場合でも例外が発生する。
-
[解決済み] android.intent.action.MAINの意味は何ですか?
-
[解決済み] APKのインストール中にDELETE_FAILED_INTERNAL_ERRORエラーが発生する。
-
[解決済み] アンドロイド バックスタックをクリアする
-
[解決済み] Androidです。バックスタックから以前のアクティビティをすべて削除する