前のアクティビティに戻らないようにする方法は?


210

電話で「戻る」ボタンが押されたときに、特定のアクティビティが前のアクティビティに戻らないようにしたいのですが。

具体的には、ログイン画面とサインアップ画面があり、どちらもHomeScreenログイン/サインアップが成功したときに呼び出される新しいアクティビティを開始します。ホーム画面が起動したら、ユーザーが[戻る]キーを押してログイン画面に戻ったり、サインアップしたりできないようにしたいと思います。

を使ってみましたIntent.FLAG_ACTIVITY_NO_HISTORYが、アプリケーションにFacebookが統合されているため、「Login with Facebook」を使用するとFacebookが最初のログイン画面に戻るため、これらのアクティビティの履歴を保持する必要があります。

ボタンを押してHomeScreen使用したときにアプリケーションを直接終了するために、戻るボタンの動作をオーバーライドすることを考えました

@Override
public void onBackPressed() {
    finish();
}

しかし、それも機能しません。


1
明確にするために、あなたはfacebook以外のすべての人の行動を取り戻そうとしていますか?
havexz

2
ある意味ではありますが、実際にログインが成功し、HomeScreenが開いた後、ユーザーが[戻る]ボタンを押してログイン画面に戻ることができないようにする必要があります。たとえばTwitterやFoursquareのように、いったんこれらのアプリにログインすると、ログオフするまでログインページは表示されません(ログイン後に[戻る]を押した場合でも)。
ecem 2011

回答:


345

私の提案は、ユーザーに戻してほしくないアクティビティを完了することです。たとえば、サインインアクティビティで、を呼び出した直後に、を呼び出しstartActivityますfinish()。ユーザーが[戻る]ボタンを押すと、スタックから削除されているため、サインインアクティビティに移動できません。


2
前のアクティビティのスレッドを実行したままにしたい場合はどうなりますか?
AlleyOOP 2014年

2
あなたは私のアプローチに行きたくないでしょう。finish()を呼び出すと、アクティビティが終了します。実行するアクティビティで実行するプロセスを開始できますか?
コーダー

7
注:finish共有の移行中に電話をかけると、前のアクティビティがブリードスルーする可能性があります。例えば、あなたが持っている場合HomeActivity- > IntermediateActivity- > FinalActivity、あなたは呼んfinish()IntermediateActivity始動直後FinalActivityあなたが表示されますHomeActivity簡単な瞬間のために。
David Murdoch

101

次の解決策は、通常のログイン/メインアクティビティのシナリオや、ブロック画面の実装でかなり役立ちます。

前のアクティビティに戻るのではなくアプリを最小化するには、次のonBackPressed()ようにオーバーライドできます。

@Override
public void onBackPressed() {
    moveTaskToBack(true);
}

moveTaskToBack(boolean nonRoot) バックスタックをそのままにし、タスク(すべてのアクティビティ)をバックグラウンドに配置します。 ユーザーがホームボタンを押した場合と同じです。

パラメータ-falseのboolean nonRoot場合、これは、アクティビティがタスクのルートである場合にのみ機能します。trueの場合、タスクのすべてのアクティビティで機能します。


3
それは歴史をそのまま保つので、ログイン画面に最適です。
Hackmodford、2016年

ありがとう、3日ほど探してみました。アクティビティのandroid:noHistory = "true"フラグが期待どおりに機能しないため(noHistoryフラグは最小化後にアクティビティを再作成します)、finish()が機能しない場合がありますが、それでも理解できません。
Denshov 2016年

37

あなたが何を望んでいるのか正確にはわかりませんが、それは可能であるように思えますし、あなたがすでに正しい方向に進んでいるようにも聞こえます。

ここに役立つかもしれないいくつかのリンクがあります:

Androidで戻るボタンを無効にする

  MyActivity.java =>
    @Override
    public void onBackPressed() {

       return;
    }

一部のアクティビティへの「戻る」を無効にするにはどうすればよいですか?

  AndroidManifest.xml =>
<activity android:name=".SplashActivity" android:noHistory="true"/>

1
私の質問で説明しようとしたFacebookの問題とコメントの1つがあるため、noHistoryオプションを使用できません。しかし、[戻る]ボタンを使用して無効にすることではありませんが、アプリケーション全体を終了するようSystem.exit(0)に呼び出されます(私はそれが最善の方法ではないことを知っていますが、例を挙げたかっただけです)。
ecem 2011

ありがとうございます。ここで提案するのは、返却の必要がないという提案だけです。super.onBackPressed();を削除し、メソッドを空白のままにします。これも問題なく動作します
hyperCoder

20

ケースには2つの解決策があります。アクティビティAがアクティビティBを開始しますが、アクティビティBのアクティビティAに戻したくない場合です。

1.バックスタックから前のアクティビティAを削除しました。

    Intent intent = new Intent(activityA.this, activityB.class);
    startActivity(intent);
    finish(); // Destroy activity A and not exist in Back stack

2.アクティビティBの[戻る]ボタンアクションを無効にしました。

戻るイベントを防ぐには、次の2つの方法があります。

1)推奨アプローチ

@Override
public void onBackPressed() {
}

2)onKeyDownメソッドをオーバーライドする

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if(keyCode==KeyEvent.KEYCODE_BACK) {
        return false;
    }
    return super.onKeyDown(keyCode, event);
}

それが役に立つことを願っていますが、それでもあなたの状況に依存します。


3
onBackPressed()を無効にするのは悪いユーザーエクスペリエンスではありませんか?
C. Skjerdal 2018年

それはあなたが何を作ろうとしているのかに完全に依存し、アプリの機能性にはこれが必要であり、それのために行きます。
user3099225

を使用した最初の方法を完全に忘れたのは驚くべきことfinish()です。nohistory属性、インテントフラグ、親アクティビティマニフェストタグなどで不必要に考えすぎている!ばかげて、答えてくれてありがとう!
varun

8

すでに多くの素晴らしい解決策が提案されているので、もっとひどい説明をしようとするのは悪いことです。

前のアクティビティに戻るのをスキップするには?

バックスタックから前のアクティビティを削除します。シンプルな

バックスタックから以前のアクティビティを削除するにはどうすればよいですか?

finish()メソッドを呼び出す

通常の流れ:

ここに画像の説明を入力してください
すべてのアクティビティは、バックスタックと呼ばれるスタックに保存されます。
新しいアクティビティ(startActivity(...))を開始すると、新しいアクティビティがスタックの一番上にプッシュされ、戻るボタンを押すと、アクティビティがスタックからポップされます。注意すべき
重要な点の1つは、[戻る]ボタンを押したときにfinish();メソッドが内部的に呼び出されることです。これは、onBackPressed()メソッドのデフォルトの動作です。

アクティビティBをスキップする場合はどうでしょうか?

つまり、A <--- C

アクティビティBのfinish();後にメソッドを追加するだけですstartActvity(...)

Intent i = new Intent(this, C.class);
startActivity(i);
finish();

ここに画像の説明を入力してください


6

finish()アプリケーション全体ではなく、現在のアクティビティを閉じる方法を提供します。そして、あなたはアプリケーションを殺すための方法を探すことを試みない方がいいです。少しアドバイス。

あなたは一緒に試しましたIntent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS | Intent.FLAG_ACTIVITY_NO_HISTORYか?Intentアクティビティを開始するときにこのフラグを使用することを忘れないでください!


2
FLAG_ACTIVITY_NO_HISTORYLogin with Facebookが使用されている場合、LoginScreenがFacebookのコールバックをキャプチャするのを防ぎます。LoginScreenからフォーカスが外れると、再開できないため(履歴がないため)。しかしIntent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS、私はそれを試していないので、確認します、ありがとう!
ecem

このfinish()方法についても感謝しましたが、知りませんでした。
ecem

4

finish()直後に置く

Intent i = new Intent(Summary1.this,MainActivity.class);
            startActivity(i);
finish();

1
これは基本的に、4年前に受け入れられた答えが言ったことです。
TylerH 2018

3

paulsm4の答えは正しいです。onBackPressed()戻るだけの場合は、戻るボタンが無効になります。ただし、ユースケースを考えると、より良いアプローチはアクティビティロジックを反転することです。つまり、ホームアクティビティをメインアクティビティにして、ユーザーがそこでサインインしているかどうかを確認し、サインインしていない場合はサインインアクティビティを開始します。その理由は、メインアクティビティの[戻る]ボタンをオーバーライドすると、ほとんどのユーザーが押し戻したときに混乱し、アプリが何もしないためです。



3

この方法は正常に機能しています

Intent intent = new Intent(Profile.this, MainActivity.class); 
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
startActivity(intent);

2

onKeyDownメソッドをオーバーライドして、[戻る]ボタンが押されたかどうかを確認するだけです。

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) 
{
    if (keyCode == KeyEvent.KEYCODE_BACK) 
    {
        //Back buttons was pressed, do whatever logic you want
    }

    return false;
}

1
@Override
public void onBackPressed() {
}

あなたが作成したとき、onBackPressed()単に削除するsuper.onBackPressed();とそれはうまくいくはずです


1

置く

finish();

ActivityStartの直後に、アクティビティを停止して、アクティビティに戻る方法を阻止します。それから加えて

onCreate(){
    getActionBar().setDisplayHomeAsUpEnabled(false);
    ...
}

あなたが始めている活動に。

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