Android: กลับไปที่กิจกรรมก่อนหน้า


524

ฉันต้องการทำสิ่งที่ง่าย ๆ บนแอพ Android เป็นไปได้อย่างไรที่จะกลับไปทำกิจกรรมก่อนหน้า

ฉันต้องใช้รหัสใดเพื่อย้อนกลับไปยังกิจกรรมก่อนหน้า


5
ติดตามกิจกรรมเปิดล่าสุด
Vuk

53
คุณเพิ่งเสร็จสิ้นการโทร (); ไชโย
เหงียนมินห์บินห์

super.finish (); หากคุณกำลังเรียกมันจากด้านในของกิจกรรม!
happyhardik

5
คำถามหนึ่งที่นี่: หาก Android ทำลายกิจกรรมก่อนหน้านี้เนื่องจากหน่วยความจำน้อยลงหรือปัญหาอื่น ๆ กิจกรรมนั้นจะไม่อยู่ในแบ็คสต็อกอีกต่อไปแล้วจะเกิดอะไรขึ้น?
ซันนี่

@ ซันนี่ฉันคิดว่าตัวรวบรวมขยะเริ่มต้นด้วยกิจกรรมที่ดีที่สุดในสแต็ค ดังนั้นหากไม่มีกิจกรรมก่อนหน้านี้ก็จะไม่มีกิจกรรมปัจจุบัน แต่ฉันแค่คิดว่าเพราะพฤติกรรมนั้นจะสมเหตุสมผลมากกว่าการเพิ่มหน่วยความจำในสแต็กโดยไม่มีคำสั่งใด ๆ แก้ไขความคิดเห็นของฉันถ้ามีคนรู้อย่างแน่นอน
Sedat Kilinc

คำตอบ:


486

กิจกรรม Android จะถูกเก็บไว้ในกองกิจกรรม การกลับไปทำกิจกรรมก่อนหน้าอาจหมายถึงสองสิ่ง

  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.homeไม่เหมือนR.id.homeที่กล่าวไว้ในความคิดเห็น


237
หรือถ้าคุณเปิดกิจกรรมด้วย startActivity () คุณสามารถปิดด้วย finish () (ไม่จำเป็นต้องผ่านพารามิเตอร์ใด ๆ )
neworld

3
คุณสามารถอธิบายว่าคุณใช้เสร็จสิ้นอย่างไรและอย่างไร () ดังนั้นเมื่อผู้ใช้กดปุ่มขึ้นมันจะนำพวกเขาไปยังกิจกรรมก่อนหน้านี้
RicNjesh

4
@RicNjesh ในวิธีการ onOptionsItemSelected ของคุณหาก Menuitem ที่คลิกมี id R.id.home แล้วโทรเสร็จสิ้น () มันจะปิดกิจกรรมปัจจุบันและนำคุณกลับไปที่กิจกรรมที่เริ่มต้นด้วย startActivity ()
Anders Ullnæss

ฉันมีผู้ใช้ไปตามกิจกรรมต่าง ๆ อย่างใดอย่างหนึ่งหลังจากที่อื่นผ่านเจตนา ฉันต้องทำอะไรเพื่อให้แน่ใจว่าแอพจะไม่ทำงานผิดพลาดกับกิจกรรมมากเกินไปในสแต็กหรือไม่ ขอบคุณ!
Ruchir Baronia

1
คุณแน่ใจหรือว่ากิจกรรม 1 จะไม่ตายในบางจุดก่อนที่คุณจะทำกิจกรรมที่ 2 เสร็จสิ้น
user924

225

ลองActivity#finish()ดู นี่คือสิ่งที่ปุ่มย้อนกลับทำขึ้นโดยค่าเริ่มต้น


1
ทำไม # หรือมันคือจุด
Nabin

8
ฉันเชื่อว่าเขาหมายถึงthis.finish();
Jens Bodal

69
The #เป็นตัวบ่งชี้ที่finish()เป็นวิธีที่ไม่คงที่ของคลาสกิจกรรม มันไม่ถูกต้อง Java แต่มันช่วยอธิบายวิธีหนึ่งอาจใช้วิธีการ
ไบรอันเฮิร์สต์

2
@ Tanis.7x มีและตัวบ่งชี้สำหรับวิธีการคงที่?
Benten

8
@ เบนที่จะเป็น.เช่น:Activity.someStaticMethod()
JonnyReeves

81

เขียนเพียงคลิกเสร็จสิ้น () มันจะนำคุณไปสู่กิจกรรมก่อนหน้า


1
แม้ว่า onBackPressed () ทำงานได้ดีฉันคิดว่าวิธีนี้ดีกว่าสำหรับการคิดออกจากกิจกรรมที่คุณต้องการเพียงเล็กน้อย .. เช่นสแกนเนอร์ OCR ในกรณีของฉัน ขอบคุณ!
Gene Bo

สิ่งนี้ตอบสนองความต้องการของฉัน .. ขอขอบคุณ
Roon13

68

แค่นี้

super.onBackPressed();

2
การโทรนี้จะเสร็จสิ้นกิจกรรมปัจจุบันดังนั้นจึงจะแสดงกิจกรรมล่าสุดที่มองเห็นได้ อย่างไรก็ตามหากไม่มีกิจกรรมก่อนหน้านี้หรือถูกทำลายในขณะที่แอปพลิเคชันอาจออก
r1k0

22
นี่มันแฮ็ค คุณไม่ควรเรียกสิ่งนี้โดยตรง นี่เป็นหนึ่งในวิธีวงจรชีวิตและควรถูกเรียกโดยระบบ Android
Dheeraj Bhaskar

33
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

สิ่งนี้จะนำคุณไปยังกิจกรรมก่อนหน้านี้เพื่อเก็บสแต็กและล้างกิจกรรมทั้งหมดหลังจากสแต็กจากสแต็ก

ตัวอย่างเช่นหาก stack เป็น A-> B-> C-> D และคุณเริ่มต้น B ด้วยการตั้งค่าสถานะนี้ stack จะเป็น A-> B


นี่คือสิ่งที่ใช้งานได้ในตอนท้ายของฉัน ชอบที่จะค้นหาสิ่งที่จะทำให้เสร็จสิ้น () ไม่ทำงาน
Relm

20

คุณต้องการควบคุมพฤติกรรมปุ่มย้อนกลับหรือไม่? คุณสามารถแทนที่ปุ่มย้อนกลับ (เพื่อไปยังกิจกรรมที่เฉพาะเจาะจง) ผ่านหนึ่งในสองวิธี

สำหรับ 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

เพียงแค่เรียกวิธีการเหล่านี้เพื่อทำกิจกรรมปัจจุบันให้เสร็จหรือกลับไปที่กดแบ็ค

finish();

หรือ

onBackPressed();

ฉันมีผู้ใช้ไปตามกิจกรรมต่าง ๆ อย่างใดอย่างหนึ่งหลังจากที่อื่นผ่านเจตนา ฉันต้องทำอะไรเพื่อให้แน่ใจว่าแอพจะไม่ทำงานผิดพลาดกับกิจกรรมมากเกินไปในสแต็กหรือไม่ ขอบคุณ!
Ruchir Baronia

13

ถ้าคุณต้องการที่จะไปเพียงแค่ต้องการที่จะไปใช้กิจกรรมก่อนหน้านี้

finish();

หรือ

onBackPressed();

หากคุณต้องการไปที่กิจกรรมที่สองหรือต่ำกว่าที่ใช้ดังต่อไปนี้:

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

ฉันมีผู้ใช้ไปตามกิจกรรมต่าง ๆ อย่างใดอย่างหนึ่งหลังจากที่อื่นผ่านเจตนา ฉันต้องทำอะไรเพื่อให้แน่ใจว่าแอพจะไม่ทำงานผิดพลาดกับกิจกรรมมากเกินไปในสแต็กหรือไม่ ขอบคุณ!
Ruchir Baronia

13

เพิ่มในวิธี onCLick () ของคุณมันจะกลับไปที่กิจกรรมก่อนหน้าของคุณ

เสร็จสิ้น();

หรือคุณสามารถใช้สิ่งนี้ มันทำงานได้อย่างสมบูรณ์แบบสำหรับฉัน

 @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

เริ่มกิจกรรมที่สองโดยใช้ความตั้งใจ (ใช้startActivityหรือstartActivityForResultตามความต้องการของคุณ) ตอนนี้เมื่อผู้ใช้กดปุ่มย้อนกลับกิจกรรมปัจจุบันที่ด้านบนจะถูกปิดและก่อนหน้านี้จะปรากฏขึ้น

ตอนนี้ให้บอกว่าคุณมีสองกิจกรรมหนึ่งกิจกรรมสำหรับเลือกการตั้งค่าบางอย่างสำหรับผู้ใช้เช่นภาษาประเทศ ฯลฯ และหลังจากเลือกแล้วผู้ใช้คลิกที่ปุ่มถัดไปเพื่อไปที่แบบฟอร์มการเข้าสู่ระบบ (ตัวอย่าง) ตอนนี้หากการเข้าสู่ระบบไม่สำเร็จผู้ใช้จะเข้าสู่กิจกรรมการเข้าสู่ระบบจะเกิดอะไรขึ้นหากการเข้าสู่ระบบสำเร็จ

หากการเข้าสู่ระบบสำเร็จคุณต้องเริ่มกิจกรรมใหม่ หมายถึงกิจกรรมที่สามจะเริ่มขึ้นและยังคงมีกิจกรรมสองกิจกรรมที่ดำเนินการอยู่ ในกรณีนี้มันจะใช้งานstartActivityForResultได้ดี เมื่อล็อกอินสำเร็จให้ส่งข้อมูล OK กลับไปที่กิจกรรมแรกและปิดกิจกรรมเข้าสู่ระบบ ตอนนี้เมื่อได้รับข้อมูลจากนั้นเริ่มกิจกรรมที่สามและปิดกิจกรรมแรกโดยใช้เสร็จสิ้น


ฉันมีผู้ใช้ไปตามกิจกรรมต่าง ๆ อย่างใดอย่างหนึ่งหลังจากที่อื่นผ่านเจตนา ฉันต้องทำอะไรเพื่อให้แน่ใจว่าแอพจะไม่ทำงานผิดพลาดกับกิจกรรมมากเกินไปในสแต็กหรือไม่ ขอบคุณ!
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

ก่อนอื่นคุณต้องจำไว้เสมอว่าหากคุณต้องการกลับไปทำกิจกรรมก่อนหน้านี้ จากนั้นอย่าเรียกวิธีเสร็จสิ้น () เมื่อไปที่กิจกรรมอื่นโดยใช้เจตนา

หลังจากนั้นคุณมีสองวิธีในการย้อนกลับจากกิจกรรมปัจจุบันไปยังกิจกรรมก่อนหน้า:

เพียงโทร: finish()ภายใต้ฟังคลิกปุ่มหรือแทนที่วิธีการต่อไปนี้เพื่อกลับมาใช้ปุ่มย้อนกลับระบบ:

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

0

นอกจากคำตอบทั้งหมดที่กล่าวมาแล้วพวกเขายังคงเป็นทางเลือกในการทำสิ่งนี้สมมติว่าคุณมีสองคลาสคลาส A และคลาส B

คลาส 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);

ในกิจกรรมที่สองของคุณ

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

ช่วยให้ crashing ข้อมูลไม่ได้ยังคงมีอยู่ผมคิดว่า
จอห์น ktejik
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.