web-dev-qa-db-ja.com

前の活動に戻らないようにするには?

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

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

私はIntent.FLAG_ACTIVITY_NO_HISTORYを使ってみましたが、アプリケーションはFacebookと統合されているので、 'Login with Facebook'を使うと、Facebookは最初のログイン画面に戻るはずです。

ボタンが押されたときにアプリケーションを直接終了するためにHomeScreenのBACKボタンの動作をオーバーライドすることを考えました。

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

しかしそれはまた働かない。

187
ecem

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

317
coder

以下の解決策は、通常のログイン/メインアクティビティのシナリオやブロッキングスクリーンの実装に非常に役立ちます。

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

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

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

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

93
Marcel Bro

私はあなたが何を望んでいるのか正確にはわかりませんが、それは可能なはずのように思えます、そしてそれはあなたがすでに正しい軌道に乗っているようにも思えます。

これは役に立つかもしれない少数のリンクです:

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

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

       return;
    }

どのようにしてある活動に戻ることを無効にできますか?

  AndroidManifest.xml =>
<activity Android:name=".SplashActivity" Android:noHistory="true"/>
34
paulsm4

あなたのケースには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);
}

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

16
Luna Kong

finish()を使用すると、アプリケーション全体ではなく現在のアクティビティを閉じることができます。そして、あなたはアプリケーションを殺すためのメソッドを探すのを試みないでください。ちょっとしたアドバイス。

あなたはIntent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS | Intent.FLAG_ACTIVITY_NO_HISTORYの接続を試みましたか? Intentの開始時のアクティビティでこのフラグを使用することを忘れないでください。

5
cadavre

直後にfinish()を置く

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

この方法はうまくいきます

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
pulak

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

2
dmon

アプリケーションのすべてのアクティビティに戻りたくない場合は、次のものを使用できます。

Android:launchMode="singleTask"

ここでもっと学びましょう: http://developer.Android.com/guide/topics/manifest/activity-element.html

2
asok Buzz

すでにたくさんのすばらしい解決策が提案されているので、illはもっと控えめな説明をしようとします。

どのようにスキップして前のアクティビティに戻ってきますか?

Backstackから前のActivityを削除します。単純な

Backstackから前のアクティビティを削除する方法

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

通常の流れ:

enter image description here
すべてのアクティビティはバックスタックと呼ばれるスタックに格納されています。
新しいアクティビティを開始すると(startActivity(...))、新しいアクティビティはスタックの一番上にプッシュされ、戻るボタンを押すとそのアクティビティがスタックからポップされます。
注意すべき重要な点は、戻るボタンが押されたときにfinish();メソッドが内部的に呼び出されることです。これはonBackPressed()メソッドのデフォルトの動作です。

それで、あなたがアクティビティBをスキップしたいのならば?

すなわちA <--- C

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

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

enter image description here

1
Rohit Singh

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
Machine Tribe

プット

finish();

ActivityStartの直後にアクティビティを停止して、元に戻ることを妨げます。それから加えて

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

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

0
Brandon Dyer
@Override
public void onBackPressed() {
}

onBackPressed()を作成したら、super.onBackPressed();を削除してください。

0
hyperCoder