Android:スタックに保存せずにアクティビティを開く


94

メインとリストの2つのアクティビティがあります。

メインからリストを開くことができます。リストからメインを開くことができます。

リストを開くたびに「履歴」に保存されないようにしてください。そのため、メインから戻ると、リストに戻ることができません

出来ますか?


11
「リスト」が「メイン」で始まる場合は、のfinish()直後に呼び出しますstartActivity(...)。そうすれば、ユーザーが「メイン」から「戻る」を押すと、戻る必要がなくなります。
Squonk 2012

これは、通知のナビゲーションのためであるが、概念は適用してもよいdeveloper.android.com/guide/topics/ui/notifiers/...
ケビン・リー・

回答:


159

リストのを開始するときにActivity、次のIntentようにフラグを設定します。

Intent i = new Intent(...); // Your list's Intent
i.setFlags(i.getFlags() | Intent.FLAG_ACTIVITY_NO_HISTORY); // Adds the FLAG_ACTIVITY_NO_HISTORY flag
startActivity(i);

このFLAG_ACTIVITY_NO_HISTORYフラグは、新しいActivityものが履歴スタックに追加されないようにします。

注意:@Samが指摘するように、i.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);代わりに使用できます。機能的な違いはありません。


2
このメソッドについて少しコメントします。アクティビティが2つしかない場合、これは完全に機能します。ただし、リストアクティビティが別のアクティビティ(3番目のアクティビティとしましょう)を起動できる場合、3番目のアクティビティの戻るボタンを押すと、リストアクティビティではなくメインアクティビティに戻ります
VinceFR

確かに。残念ながら、それを回避する方法はありません。IntentActivity原点に戻らない場合にのみ履歴に追加する」というフラグはありません。
Eric

1
いいえ、ただしFLAG_ACTIVITY_NEW_TASKフラグで処理されます。リストアクティビティは履歴に追加されますが、常に一番上にあるため、メインアクティビティからのバックプレスではリストアクティビティが表示されません
VinceFR

7
の代わりに使用setFlags()した特別な理由はありますか?getFlags()Intent.addFlags()
Sam

1
@VinceFRそれはまさに私が欲しいものです!
a-

89

マニフェストファイルに以下を追加します。

android:noHistory="true" 

スタックに保持したくないアクティビティに。


フラグno_historyでアクティビティを開始することと何か違いはありますか?
realtebo 2012

1
あなたの質問で言ったように、「リストを開くたびに「履歴」に保存されない」したがって、アプリケーションを再度開くと、メインアクティビティに移動します
Marcin S.

@MarcinS。アプリが最近のアプリリストにない場合、機能していません。あなたはなぜこれが起こっていることについて説明していただけます
アジットクマールDubeyさん

1
では、これら2つのアプローチ(マニフェストとフラグ)の違いは何ですか?
パンボシャ2017年

@pumboshaマニフェストアプローチでは、常にアクティビティが履歴から除外されます。フラグアプローチでは、実行時にその動作を制御できます。
John Crawford、

27

クリアで新しいタスクを使用します。これは私の場合、他のオプションが機能しなかったときに機能しました。

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);

履歴スタック全体をクリアし、Androidで新しいアクティビティを開始します


1
これは素晴らしいことですが、システムの大規模な「変化するタスク」アニメーションを停止する方法はありますか?FLAG_ACTIVITY_NO_ANIMATIONを追加しても、残念ながらそれを防ぐことはできません。
androidguy 2017

これはアプリケーションの速度に影響しますか?
–AcauãPitta

23

別のアクティビティを開いた直後にアクティビティでfinish()を呼び出すと、終了したアクティビティはスタックから削除されるようです。

例えば:

Intent intent = new Intent(this, NextActivity.class);
startActivity(intent);
finish();

スマートフォンの速度がそれほど速くない場合は、前のアクティビティがオフになっているのがわかります。
Nolan

@Nolanは、アクティビティを開始する前に終了した場合に限ります
HenrikBøgelundLavstsen 2017

7

私の特定のケースでFLAG_ACTIVITY_NO_HISTORYはうまくいきませんでした。どちらもなかったFLAG_ACTIVITY_NEW_TASKFLAG_ACTIVITY_CLEAR_TASKだけでは自分自身の仕事によります。

しかしFLAG_ACTIVITY_NEW_TASKFLAG_ACTIVITY_CLEAR_TASK一緒に仕事をしました。

Intent intent = new Intent(FooActivity.this, MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);

3

Kotlinでこれを行う方法を追加したかっただけです:

val i = Intent(this, LogInActivity::class.java)
startActivity(i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK))

2
Kotlinの方法の詳細: Intent(this, MainActivity::class.java).apply { addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK) }.also { startActivity(it) }
4ndro1d

3

遅い答えですが、他の答えに深みを加えます。それはすべて、その活動から始まった他の活動で何をしたいのかによって決まります

オプション1-この1つのアクティビティのみに呼び出しアクティビティの履歴がない

次に、ちょうど行います:

Intent i = new Intent(...);
i.addFlag(Intent.FLAG_ACTIVITY_NO_HISTORY);
startActivity(i);

オプション2-その特定のアクティビティから開始されたすべてのアクティビティに履歴がないこと

次に、呼び出しアクティビティのマニフェストを追加します。

android:noHistory="true" 

ただし、新しいアクティビティの履歴を保持したい場合は、手動でフラグを削除する必要があります。

Intent i = new Intent(...);
i.removeFlag(Intent.FLAG_ACTIVITY_NO_HISTORY);
startActivity(i);

他の回答をクリアしてくれることを願っています:)


2

アクティビティがすでに実行されている場合は、FLAG_ACTIVITY_CLEAR_TOPを試してください。

Intent intent = new Intent(this, MyActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);


-4

特定のアクティビティの戻るボタンをオーバーライドして「戻る」機能を停止することはできませんか?

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_BACK) {

        return true;
    }
    return super.onKeyDown(keyCode, event);
}

6
これを行わないでください。特定の目的のためにBACKをインターセプトすることは許容されますが、純粋にBACKプレスをサイレントで消費し、終了を防ぐことはお勧めActivityできません。
Squonk 2012

1
完全に同意する^単なるオプション。
Broak

1
そのOnBackPressedためにあります。
Fred
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.