Androidでアクティビティを閉じて前のアクティビティに戻る方法


144

私はメインアクティビティを持っています。ボタンをクリックすると、新しいアクティビティが開始されます。そのために次のコードを使用しました。

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

上記のコードはメインアクティビティから実行されました。

ここで、メインアクティビティによって呼び出される新しいアクティビティに、戻るボタンがあります。この戻るボタンをクリックすると、新しいアクティビティを閉じて元のメインアクティビティに戻る必要があります。

私は、呼び出し試してみましたsuper.finish()とばかりfinish() (新しい活動から)が、これは、(私の主な活動を含む)私の全体のアプリケーションを閉じます。

現在フォーカスされているアクティビティを閉じて、メインアクティビティに戻るにはどうすればよいですか?

編集済み

スマートフォンの戻るボタンもアプリ全体を閉じるという事実により、2番目のアクティビティを誤って起動したと思いますか?


OK探していました

同じマニフェストコードと同じコードを使用してアクティビティを開始する設定アクティビティを作成しました。

アクティビティ設定の「戻る」ボタンを押すと、メインアクティビティに戻ります。

メインの質問で上記のアクティビティを使用すると、アプリ全体が終了します。

したがって、問題は、アクティビティを終了するコードではなく、アクティビティ自体にあるようです。


4
戻るボタンも必要ありません。ユーザーに電話の戻るキーを使用させるだけで、何もする必要はありません。
Hoan Nguyen

電話の戻るボタンは、私の二次的なアクティビティだけでなく、エントリアプリケーションを閉じます。メインアクティビティを閉じたくありません。
Zapnologica 2013年

1
「戻る」ボタンはそれをすべきではありません-あなたはあなたのコードをもっと見せることができますか?
peejaybee 2013年

あなたの編集に応答して、二次的なアクティビティはあなたが投稿したものから良さそうです。おそらくTGMCの人々が正しい答えを持っていると思います。あなたはあなたのマニフェストを調査します。
peejaybee 2013年

この回答を参照してください。これはあなたに役立つと思います
Muhammad Helmi

回答:


201

始める前にfinish()メソッドを呼んでいると思います。MainActivitySettingsActivity

説明したシナリオは、次の2つの方法で発生します。

どちらか

あなたが設定しているandroid:noHistory = "true"ためMainActivity内部のAndroidManifest.xml原因MainActivityfinishバックキーを押すと、自動的に。

または

「SettingsActivity」に切り替える前に、を呼び出しfinish()MainActivity、それを強制終了しています。戻るボタンを押すと、他のアクティビティはポップするスタックにプリセットされていないため、メイン画面に戻ります。


これは、電話の「戻る」ボタンもメインのアクティビティを閉じる理由を説明しています。
peejaybee 2013年

デバッグ中、finish()の後も実行が続くことに気づいたので、さらにreturnを置くことをお勧めします。
2015

この答えの3番目の理由は、最初の答えの繰り返しではありませんか?
2016年

60

現在のアクティビティでfinish()を呼び出すだけで、前のアクティビティに戻ることができます。finish()呼び出しが実行された後のコードに注意してください-これを修正するには、finish()を呼び出した後にreturnを実行するだけです。

結果をアクティビティ1に戻したい場合は、アクティビティ2を開始するときに必要です。

startActivityForResults(myIntent, MY_REQUEST_CODE);

呼び出されたアクティビティ内では、onCreate()パラメータからIntentを取得するか、使用することができます

getIntent();

結果をアクティビティ1に設定してからアクティビティ2で設定するには

setResult(Activity.RESULT_OK, MyIntentToReturn);

戻る意思がない場合は、

setResult(Activity.RESULT_OK);

アクティビティの結果が悪い場合は、Activity.RESULT_CANCELEDを使用できます(これはデフォルトで使用されます)。次に、アクティビティ1で行う

onActivityResult(int requestCode, int resultCode, Intent data) {
    // Handle the logic for the requestCode, resultCode and data returned...
}

アクティビティ2を終了するには、結果がすでに設定されている状態で、上記のようにfinish()で同じメソッドを使用します。


1
「finish()呼び出しが実行された後のコードに注意してください-これを修正するために、finish()を呼び出した後にリターンを実行することができます。次の行の実行を回避しているようなものです(修正ではありません)。
Lo-Tan

14

ボタンをクリックすると、次のように呼び出すことができます。

super.onBackPressed();

11

フラグメントを使用する場合、uを使用する必要があります

getActivity().onBackPressed();

あなたが使用できる単一の活動を使用する場合

finish();

7

代わりにこのコードを試してくださいfinish

onBackPressed();


2
ActivityBからActivityAに戻るには問題ありません。フラグメントと単一のアクティビティには、@ Osama Ibrahimの回答を使用できます。
Eftekhari、2015

4

難しすぎます。あなたが正しくやろうとしていることを理解している場合、組み込みの「戻る」ボタンとAndroid自体がすべての作業を行います。http//developer.android.com/guide/components/tasks-and-back- stack.html

また、カスタムの「戻る」ボタンを実装すると、コアアプリ品質ガイドラインUX-N1に違反します。http//developer.android.com/distribute/googleplay/quality/core.html


4
Button edit = (Button) view.findViewById(R.id.yourButton);
edit.setOnClickListener(new OnClickListener() {

    @Override
    public void onClick(View view) {
        Intent intent = new Intent(this, YourMainActivity.class);
        startActivity(intent);
        finish();
    }
});

4

これにより、アプリケーション全体が閉じます。

this.finish();

これは、現在のアクティビティだけでなく、質問で述べたようにアプリケーション全体を閉じます。
Zapnologica 2013年

カメラアクティビティから前のアクティビティに戻る方法を教えてください。
coderpc

2
いいえ、ありません。現在のアクティビティのみを閉じます。参照:developer.android.com/reference/android/app/...
Firzen

4

2番目のアクティビティは、おそらく子供のアクティビティとしてのメインのアクティビティとは関連がないと思います。AndroidManifest.xmlファイルをチェックして<activity>、子アクティビティのエントリにandroid:parentActivityName属性が含まれているかどうかを確認してください。次のようになります。

<?xml ...?>
...
<activity
    android:name=".MainActivity"
    ...>
</activity>
<activity
    android:name=".ChildActivity"
    android:parentActivityName=".MainActivity"
    ...>
</activity>
...

1

finish()自分を呼び出さないでください。そうすれば、その関数で他のことをしているのでない限り、自分MainActivityをオーバーライドする必要がなくなります。あなたはこのバックボタンの「必要性」を感じるなら、あなたは簡単に呼び出すことができますに、それはあなたに行くことができます、あなたが呼び出されていない限り、それにonBackPressed()SecondActivityfinish()SecondActivityMainActivityfinish()


私はこのルートを試しましたが、高解像度のPNGを使用する画面が10枚ほど順番に並んでいます。問題は、画面7について、バックスタックのすべてのアクティビティが原因でデバイスがメモリ不足になることです。各アクティビティでfinishを呼び出すことを決定し、ガベージコレクションを許可することで問題を解決しましたが、バックスタックが空になったため、バック動作を手動でコーディングする必要があります。この問題に遭遇したり、これに対処するためのAndroidのメカニズムを知っていますか?
Lo-Tan

戻るボタンで何をしたいですか?以前の状態Activityに戻るか、常にMainActivity?に戻ります。また、メモリが不足しているBitmaps場合は、ドキュメントのこの部分をお読みください。それは私を助けました
codeMagic 2013年

@ Lo-Tan以前のアクティビティに戻りたい場合は、画像のメモリ管理を理解し、アクティビティを終了しないようにする必要があると思います(おそらく、提供したリンクを使用します)。それ以外の場合は、アクティビティの新しいインスタンスを再作成し、どのインスタンスに戻るかを
特定

戻るボタンで前の画面に戻るだけです。これは基本的に一連のチュートリアル画面であり、ユーザーは前後に進むことができます。各画面は設計されており、多くのpngを使用します-小さなサムネイルだけでなく、ほとんどの画面を占めるpngは、各画面で大量のメモリを消費します。
Lo-Tan

@ Lo-Tan onBackPressed()メソッドをオーバーライドして、移動先のアクティビティを手動で作成したいと思います。次に、現在のものを終了し、前のものを起動できます。
Zapnologica 2013年

1

これがさらに役立つかどうかはわかりませんが、同じ問題に取り組んでおり、グローバルブール変数とonResume()アクションのみを使用して、非常に簡単な方法を見つけました。私の場合、私のアクティビティCが特定のボタンをクリックすると、アクティビティBのfinish()がトリガーされます。

Activity_A-> Activity_B-> Activity_C

Activity_A(通常はActivity_Bを開きます)

Activity_B(ボタンをクリックするとActivity_Cが開きます):

// Global:
boolean its_detail = false;
// -------
SharedPreferences prefs =  getApplicationContext().getSharedPreferences("sharedpreferences", 0);
boolean v = prefs.getBoolean("select_client", false);

its_detail = v;

startActivity(C);

@Override
public void onResume(){
     super.onResume();
     if(its_detail == true){
        finish();
     }
}

したがって、アクティビティCのボタンをクリックすると、アクティビティBの「onResume()」関数が実行され、アクティビティAに戻ります。


1
 @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();

        if ( id == android.R.id.home ) {
            finish();
            return true;
        }

        return super.onOptionsItemSelected(item);
    }

これを試してください。ツールバーの戻るボタンハードウェアの戻るボタンの両方で機能します


これは私のために働いた。また、私は持っていたMainActivitySettingsActivityandroid:parentActivityName=".MainActivity"1秒間に。このコードは、ツールバットのホーム/戻るボタンを処理し、現在のアクティビティを終了して、スタック内の前のアクティビティに戻ります。ありがとう。
mortalis

1

Finishはアプリケーション全体を閉じます。これは、Android開発で嫌いなもので、finishではなく、問題ありませんが、構文に問題がありません。

startActivity(intent)

何故なの

closeActivity(intent)?


1
これは質問に答えますか?それともこれは試すべき提案だけですか?どちらの場合でも、暴言は不要であり、SOでは歓迎されない可能性があります
Gilles Gouaillardet 2017

1

非常によく似た状況が発生しました。

アクティビティ1(オープニング)->アクティビティ2(プレビュー)->アクティビティ3(詳細)

「オンバックプレス」の応答が正しくない

  • アクティビティ3のデバイスバックプレスもアクティビティ2を閉じます。

上記のすべての回答を確認しましたが、どれもうまくいきませんでした。アクティビティ2とアクティビティ3の間の遷移のJava構文が正しくなるように見直されました。

サードパーティのアプリの呼び出しに関するコーディングからの新鮮さ。アクティビティによって。構成の角度を調査することにしました。最終的には問題の根本的な原因を特定できるようになりました。

スコープ:アクティビティ2の構成(呼び出し元)。

根本原因

android:launchMode="singleInstance"

ソリューション

android:launchMode="singleTask"

どうやらこの「オンバックプレス」の問題では、singleInstanceは呼び出しアクティビティを含む1つのインスタンスで呼び出されたアクティビティを考慮しますが、singleTaskは、意図されたオンバックプレスが機能するために十分な独自のIDを持つ呼び出されたアクティビティを許可します。


0
{ getApplicationContext.finish();   }

この方法を試してください。


このコードブロックで質問に答えることができますが、なぜそうなるのかについて少し説明を提供できれば最適です。
デビッド

0

あなたがfinish()を呼び出している可能性があります; クリックボタンイベントでは、ボタンをクリックした直後にメインアクティビティが閉じられ、次のアクティビティから戻ったときに、メインアクティビティがすでに閉じられており、アクティブなアクティビティがないため、アプリケーションが終了します。


0

アクティビティのonCreateメソッドで、次のコードを記述します。

getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setDisplayShowHomeEnabled(true);

次に、アクティビティのonOptionsItem選択メソッドを次のようにオーバーライドします

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()){
        case android.R.id.home:
            finish();
    }
    return super.onOptionsItemSelected(item);
}

そして、あなたは行ってもいいです。


0

これをMainActivityで使用する必要があります

 Intent intent = new Intent(context , yourActivity);

            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK |Intent.FLAG_ACTIVITY_MULTIPLE_TASK);
            context.startActivity(intent);

フラグは、MainActivityを維持する複数のタスクを開始します。finishを呼び出すと、他のアクティビティが強制終了され、MainActivityに戻ります

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