Android:前のアクティビティに戻る


525

Androidアプリで簡単なことをしたいのですが。前のアクティビティに戻るにはどうすればよいですか。

前のアクティビティに戻るにはどのコードが必要ですか


5
最後に開いたアクティビティを追跡する
Vuk

54
あなたは単純にfinish();を呼び出すだけです。乾杯
Nguyen Minh Binh

super.finish(); アクティビティの内部から呼び出す場合!
happyhardik 2012

5
ここで1つの質問:メモリが少ないなどの問題が原因でAndroidが以前のアクティビティを破棄した場合、そのアクティビティはバックスタックに存在しなくなり、何が起こりますか?
2014

@Sunnyガベージコレクターはスタックの最上位のアクティビティから始まると思います。したがって、前のアクティビティがない場合、現在のアクティビティもありません。ただし、その動作は特定の順序なしでスタック内のメモリを解放するよりも理にかなっているためです。誰かが正確に知っている場合は、私のコメントを訂正してください。
Sedat Kilinc 2017年

回答:


486

Androidアクティビティはアクティビティスタックに格納されます。前のアクティビティに戻るには、2つの意味があります。

  1. startActivityForResultを使用して、別のアクティビティから新しいアクティビティを開きました。その場合は、コードからfinishActivity()関数を呼び出すだけで、前のアクティビティに戻ることができます。

  2. アクティビティスタックを追跡します。インテントで新しいアクティビティを開始するたびに、FLAG_ACTIVITY_REORDER_TO_FRONTまたはのようなインテントフラグを指定できますFLAG_ACTIVITY_PREVIOUS_IS_TOP。これを使用して、アプリケーションのアクティビティ間をシャッフルできます。しかし、それらをあまり使用していません。こちらのフラグをご覧ください:http : //developer.android.com/reference/android/content/Intent.html

コメントで述べたように、アクティビティがで開かれている場合、でstartActivity()閉じることができfinish()ます。「上へ」ボタンを使用したい場合は、コメントに記載されているのとは異なりonOptionsSelected(MenuItem item)、アイテムIDをチェックすることでそのメソッドをキャッチできます。android.R.id.homeR.id.home


237
または、startActivity()でアクティビティを開いた場合は、finish()で閉じることができます(パラメーターを渡す必要はありません)
neworld

3
ユーザーが上ボタンを押すと、前のアクティビティに
移動

4
@RicNjesh onOptionsItemSelectedメソッドで、クリックされたメニュー項目のIDがR.id.homeの場合、finish()を呼び出します。現在のアクティビティを閉じ、startActivity()で開始したアクティビティに戻ります
AndersUllnæss

私はユーザーに意図を介して次々と多くのアクティビティを行ってもらいます。スタック上のアクティビティが多すぎてアプリがクラッシュしないようにするために何かする必要がありますか?ありがとう!
Ruchir Baronia

1
アクティビティ2を完了する前に、アクティビティ1がいつの時点で死ぬことはありませんか?
user924

225

お試しくださいActivity#finish()。これは多かれ少なかれ、デフォルトで戻るボタンです。


1
なぜ #?それともドットですか?
Nabin

8
私は彼が意味したと信じていますthis.finish();
イェンス・ボダル2014

69
#指標であるfinish()アクティビティクラスの非静的メソッドです。これは有効なJavaではありませんが、メソッドの使用方法を説明するのに役立ちます。
ブライアンハーブスト2014

2
@ Tanis.7x静的メソッドのインジケーターはありますか?
ベンテン

8
@Bentenは.、つまり:Activity.someStaticMethod()
JonnyReeves 2015年

81

クリックして書くfinish()。前のアクティビティに移動します。


1
onBackPressed()も機能しますが、このソリューションは、ほんの少しだけ必要なアクティビティを終了することを考えるのに適していると思います。たとえば、私の場合はOCRスキャナーです。ありがとう!
Gene Bo

これは私のニーズを満たします。ありがとう。
Roon13

68

これだけ

super.onBackPressed();

2
この呼び出しは現在のアクティビティを終了するだけなので、最後のアクティビティが表示されます。ただし、前のアクティビティがないか、その間に破棄された場合、アプリケーションが終了することがあります。
r1k0 2012

22
これはハッカです。これを直接呼び出すことはできません。これはライフサイクルメソッドの1つであり、Androidシステムから呼び出す必要があります。
Dheeraj Bhaskar 2014

33
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

これにより、スタックを保持し、その後のすべてのアクティビティをスタックからクリアする前のアクティビティに移動します。

たとえば、スタックがA-> B-> C-> Dで、このフラグでBを開始すると、スタックはA-> Bになります。


これが私の目的で機能します。finish()が機能しない原因を見つけたいと思います。
Relm

20

戻るボタンの動作を制御したいですか?2つのメソッドのいずれかを使用して、(特定のアクティビティに移動するために)戻るボタンをオーバーライドできます。

Android 1.6以下の場合:

@Override
public boolean onKeyDown(int keyCode, KeyEvent event)  {
    if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {
        // do something on back.
        return true;
    }

    return super.onKeyDown(keyCode, event);
}

または、Android 2.0以上のみをサポートしている場合:

@Override
public void onBackPressed() {
    // do something on back.
    return;
}

詳細:http : //android-developers.blogspot.com/2009/12/back-and-other-hard-keys-three-stories.html


19

これらのメソッドを呼び出すだけで、現在のアクティビティを終了するか、onBackPressedで戻ることができます

finish();

または

onBackPressed();

私はユーザーに意図を介して次々と多くのアクティビティを行ってもらいます。スタック上のアクティビティが多すぎてアプリがクラッシュしないようにするために何かする必要がありますか?ありがとう!
Ruchir Baronia

13

前のアクティビティに行きたいだけに行きたい場合

finish();

または

onBackPressed();

2番目のアクティビティ以下に移動する場合は、以下を使用します。

intent = new Intent(MyFourthActivity.this , MySecondActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
//Bundle is optional
Bundle bundle = new Bundle();
bundle.putString("MyValue1", val1);
intent.putExtras(bundle);
//end Bundle
startActivity(intent);

1
私はfinish()とonBackPressed()の両方が機能することを発見しましたが、少なくとも私のアプリでは、finish()は非常に遅く、onBackPressed()ははるかに高速です。奇妙な。
scrayne 2015年

私はユーザーに意図を介して次々と多くのアクティビティを行ってもらいます。スタック上のアクティビティが多すぎてアプリがクラッシュしないようにするために何かする必要がありますか?ありがとう!
Ruchir Baronia

13

これをonCLick()メソッドに追加すると、前のアクティビティに戻ります

finish();

またはこれを使用できます。それは私にとって完璧に機能しました

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

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

  return super.onOptionsItemSelected(item);
  }

11

AndroidManifest.xmlファイルを親アクティビティで正しく設定している場合は、次を使用できます。

NavUtils.navigateUpFromSameTask(this);

これはあなたの子供の活動です。




7

同じ問題を抱えて

finish();  OR super.onBackPressed();

私にとってはうまくいきましたが、どちらも同じように機能しましたが、 return


6

インテントを使用して2番目のアクティビティを開始します(使用startActivityまたはstartActivityForResultします、要件に応じて)。ユーザーが戻るボタンを押すと、上部の現在のアクティビティが閉じられ、前のアクティビティが表示されます。

ここで、2つのアクティビティがあるとします。1つは言語、国などのユーザーの設定を選択するアクティビティで、それを選択した後、ユーザーは[次へ]ボタンをクリックしてログインフォーム(たとえば)に移動します。ログインが失敗した場合、ユーザーはログインアクティビティに参加します。ログインが成功した場合はどうなりますか?

ログインが成功した場合は、別のアクティビティを開始する必要があります。これは、3番目のアクティビティが開始され、それでも2つのアクティビティが実行されていることを意味します。この場合、を使用するとよいでしょうstartActivityForResult。ログインが成功したら、最初のアクティビティにOKデータを送り、ログインアクティビティを閉じます。データを受信したら、3番目のアクティビティを開始し、finishを使用して最初のアクティビティを閉じます。


私はユーザーに意図を介して次々と多くのアクティビティを行ってもらいます。スタック上のアクティビティが多すぎてアプリがクラッシュしないようにするために何かする必要がありますか?ありがとう!
Ruchir Baronia

5

あなたはこれを試すことができます:

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

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

4

finish()呼び出し側のアクティビティでをコーディングしていない限り、デフォルトですべての新しいアクティビティ/インテントは前の動作に戻ります。


4
@Override
public void onBackPressed() {
    super.onBackPressed();
}

ボタンをクリックしたい場合は、戻るボタンをクリックしてください。

bbsubmit.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        onBackPressed();
    }
});

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

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

      return super.onOptionsItemSelected(item);
 }

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


2

NavUtils.navigateUpFromSameTask()をお勧めします。これは簡単で非常に簡単です。Googleの開発者から学ぶことができます。


1

以前のアクティビティに戻るケースはほとんどありません。

ケース1:結果を以前のアクティビティに戻す場合は、 ActivityA.java

 Intent intent = new Intent(ActivityA.this, FBHelperActivity.class);
               startActivityForResult(intent,2);

FBHelperActivity.java

 Intent returnIntent = new Intent();
 setResult(RESULT_OK, returnIntent);
 finish();

ケース2: ActivityA-> FBHelperActivity ----> ActivityA

ActivityA.java

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

FBHelperActivity.java

after getting of result call finish();
 By this way your second activity will finish and because 
 you did not call finish() in your first activity then
 automatic first activity is in back ground, will visible.

1

まず、前のアクティビティに戻りたい場合は、そのことを覚えておく必要があります。次に、Intentを使用して別のアクティビティに移動するときに、finish()メソッドを呼び出さないでください。

その後、現在のアクティビティから前のアクティビティに戻るには2つの方法があります。

単に呼び出す:finish()ボタンクリックリスナーの下で、または次のメソッドをオーバーライドして、システムの戻るボタンを使用して戻る:

@Override
public void onBackPressed() {
    super.onBackPressed();
}

0

言及されたすべての回答に加えて、それらはこれを行う別の方法です。クラスAとクラスBの2つのクラスがあるとします。

クラスAは、チェックボックス選択などのいくつかのアクティビティを行い、データとクラスBへの意図を出力しました。クラスB、クラスAに複数の値を渡し、クラスAの以前の状態を維持したい場合、使用できます。これを実証する方法またはソースコードをダウンロード

http://whats-online.info/science-and-tutorials/125/Android-maintain-the-previous-state-of-activity-on-intent/

または

http://developer.android.com/reference/android/content/Intent.html


0

これを試してみてください、最初のアクティビティ

Intent mainIntent = new Intent(Activity1.this, Activity2.class);
this.startActivity(mainIntent);

2番目のアクティビティで

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

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