วิธีปิดกิจกรรมและกลับไปที่กิจกรรมก่อนหน้าใน android


144

ฉันมีกิจกรรมหลักที่เมื่อฉันคลิกที่ปุ่มเริ่มกิจกรรมใหม่ฉันใช้รหัสต่อไปนี้เพื่อทำ:

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

รหัสข้างต้นถูกเรียกใช้จากกิจกรรมหลัก

ตอนนี้ในกิจกรรมใหม่ของฉันซึ่งถูกเรียกโดยกิจกรรมหลักฉันมีปุ่มย้อนกลับ เมื่อฉันคลิกที่ปุ่มย้อนกลับนี้ฉันต้องการให้กิจกรรมใหม่ของฉันปิดและต้องกลับไปที่กิจกรรมหลักดั้งเดิม

ฉันลองโทรsuper.finish()แล้วfinish() (จากกิจกรรมใหม่) แต่นี่ก็ปิดแอปพลิเคชันทั้งหมดของฉัน (รวมถึงกิจกรรมหลักของฉัน)

ฉันจะปิดกิจกรรมที่กำลังโฟกัสอยู่และกลับไปยังกิจกรรมหลักได้อย่างไร

แก้ไข

ข้อเท็จจริงที่ว่าปุ่มย้อนกลับของโทรศัพท์ของฉันปิดทั้งแอปทำให้ฉันคิดว่าฉันเริ่มต้นกิจกรรมที่สองไม่ถูกต้องหรือไม่


ตกลงฉันได้รับการมอง

ฉันสร้างกิจกรรมการตั้งค่าที่ใช้รหัสรายการเดียวกันและรหัสเดียวกันเพื่อเริ่มกิจกรรม

สำหรับกิจกรรมการตั้งค่าเมื่อฉันกดปุ่มย้อนกลับมันจะกลับสู่กิจกรรมหลัก

ด้วยกิจกรรมดังกล่าวข้างต้นในคำถามหลักเพียงแค่ออกจากแอปทั้งหมดของฉัน

ดังนั้นปัญหาดูเหมือนจะไม่ได้อยู่กับรหัสที่จะเสร็จสิ้นกิจกรรม แต่กิจกรรมเอง


4
คุณไม่จำเป็นต้องมีปุ่มย้อนกลับเพียงให้ผู้ใช้ใช้ปุ่มย้อนกลับโทรศัพท์และคุณไม่ต้องทำอะไรเลย
Hoan Nguyen

ปุ่มย้อนกลับโทรศัพท์ปิดแอปพลิเคชันการเข้าร่วมไม่ใช่เฉพาะกิจกรรมรองของฉัน ฉันไม่ต้องการปิดกิจกรรมหลัก
Zapnologica

1
ปุ่ม 'ย้อนกลับ' ไม่ควรทำอย่างนั้น - คุณสามารถแสดงรหัสได้มากขึ้นหรือไม่?
peejaybee

การตอบสนองต่อการแก้ไขของคุณกิจกรรมรองดูดีจากสิ่งที่คุณโพสต์ ฉันคิดว่า TGMCians อาจมีคำตอบที่ถูกต้องและคุณตรวจสอบรายการของคุณ
peejaybee

เห็นนี้คำตอบที่ฉันคิดว่านี้จะช่วยให้คุณ
มูฮัมหมัด Helmi

คำตอบ:


201

ฉันคิดว่าคุณจะเรียกfinish()วิธีการในก่อนที่จะเริ่มMainActivitySettingsActivity

สถานการณ์ที่คุณอธิบายจะเกิดขึ้นในสองวิธีต่อไปนี้:

ทั้ง

คุณได้ตั้งค่าandroid:noHistory = "true"สำหรับMainActivityภายในAndroidManifest.xmlซึ่งเป็นสาเหตุของMainActivityการfinishโดยอัตโนมัติเมื่อกดปุ่มย้อนกลับ

หรือ

ก่อนที่จะเปลี่ยนเป็น 'การตั้งค่าการใช้งาน' ของคุณคุณได้โทรหาfinish()คุณMainActivityซึ่งฆ่ามัน เมื่อคุณกดปุ่มย้อนกลับเนื่องจากไม่มีกิจกรรมอื่นที่ตั้งไว้ในสแต็กเป็นป๊อปอัพกิจกรรมจะกลับไปที่หน้าจอหลัก


นั่นจะอธิบายว่าเหตุใดปุ่ม 'ย้อนกลับ' ของโทรศัพท์จึงยกเลิกกิจกรรมหลัก
peejaybee

เมื่อตรวจแก้จุดบกพร่องฉันสังเกตเห็นการดำเนินการต่อหลังจากเสร็จสิ้น () ดังนั้นจึงแนะนำให้ใส่ผลตอบแทนเพิ่มเติม
จนถึง

เหตุผลที่สามในคำตอบนี้ไม่ใช่แค่ทำซ้ำสิ่งแรกใช่หรือไม่
ปาง

60

คุณสามารถกลับไปที่กิจกรรมก่อนหน้าโดยเพียงแค่โทรเสร็จสิ้น () ในกิจกรรมที่คุณอยู่ โปรดทราบว่ารหัสใด ๆ หลังจากการโทรเสร็จสิ้น () จะถูกเรียกใช้คุณสามารถส่งคืนได้หลังจากการโทรเสร็จสิ้น () เพื่อแก้ไขปัญหานี้

หากคุณต้องการส่งคืนผลลัพธ์ไปยังกิจกรรมหนึ่งเมื่อคุณเริ่มกิจกรรมที่สองคุณต้อง:

startActivityForResults(myIntent, MY_REQUEST_CODE);

ภายในกิจกรรมที่คุณเรียกว่าคุณจะสามารถรับค่าเจตนาจากพารามิเตอร์ onCreate () หรือใช้งานได้

getIntent();

ในการตั้งค่าให้ส่งคืนผลลัพธ์เป็นกิจกรรมหนึ่งจากนั้นในกิจกรรมที่สองทำได้

setResult(Activity.RESULT_OK, MyIntentToReturn);

หากคุณไม่มีเจตนาจะคืนก็ให้พูด

setResult(Activity.RESULT_OK);

หากกิจกรรมมีผลลัพธ์ที่ไม่ดีคุณสามารถใช้ Activity.RESULT_CANCELED (ค่าเริ่มต้นจะถูกใช้) จากนั้นในกิจกรรมที่คุณทำ

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

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


1
"สังเกตรหัสใด ๆ หลังจากการโทรเสร็จสิ้น () จะถูกเรียกใช้ - คุณสามารถส่งคืนได้หลังจากการโทรเสร็จสิ้น () เพื่อแก้ไขปัญหานี้" ฉันคิดว่า 'แก้ไข' เป็นตัวเลือกคำที่ไม่ดีที่นี่ เหมือนกับว่าคุณกำลังหลีกเลี่ยงการดำเนินการของบรรทัดต่อไปนี้ (ไม่ใช่การแก้ไข)
Lo-Tan



7

ลองใช้รหัสนี้แทนfinish:

onBackPressed();


2
ทำงานได้ดีสำหรับการย้อนกลับจาก ActivityB ถึง ActivityA สำหรับชิ้นส่วนและกิจกรรมเดี่ยวสามารถใช้คำตอบของ @Osama Ibrahim
Eftekhari

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

ฉันจะไปยังกิจกรรมก่อนหน้าจากกิจกรรมกล้องได้อย่างไร
coderpc

2
ไม่เลย มันปิดกิจกรรมปัจจุบันเท่านั้น ดู: developer.android.com/reference/android/app/…
Firzen

4

ฉันเชื่อว่ากิจกรรมที่สองของคุณอาจไม่ได้เชื่อมโยงกับกิจกรรมหลักของคุณในฐานะกิจกรรมเด็ก ตรวจสอบAndroidManifest.xmlไฟล์ของคุณและดูว่า<activity>รายการสำหรับกิจกรรมย่อยของคุณมีandroid:parentActivityNameแอตทริบิวต์หรือไม่ ควรมีลักษณะดังนี้:

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

1

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


ฉันลองใช้เส้นทางนี้ แต่ฉันมีประมาณ 10 หน้าจอตามลำดับที่ใช้ PNG ความละเอียดสูง ปัญหาคือประมาณหน้าจอ 7 อุปกรณ์หมดความทรงจำเนื่องจากกิจกรรมทั้งหมดใน back-stack ฉันตัดสินใจโทรเสร็จในแต่ละกิจกรรมและสิ่งนี้แก้ไขปัญหาโดยอนุญาตให้มีการรวบรวมขยะ แต่ตอนนี้พฤติกรรมด้านหลังจำเป็นต้องเข้ารหัสด้วยตนเองเพราะตอนหลังว่างเปล่า คุณพบปัญหานี้หรือรู้กลไกใด ๆ ใน Android เพื่อแก้ไขปัญหานี้หรือไม่?
Lo-Tan

คุณต้องการให้ปุ่มย้อนกลับทำอะไร กลับไปที่สิ่งที่เคยActivityเป็นหรือเคยกลับไปที่MainActivity? นอกจากนี้หากคุณมีหน่วยความจำไม่เพียงพอBitmapsคุณควรอ่านส่วนนี้ของเอกสาร มันช่วยฉันได้
codeMagic

@ Lo-Tan หากคุณต้องการกลับไปที่กิจกรรมก่อนหน้านี้ฉันคิดว่าคุณต้องคิดออกการจัดการหน่วยความจำสำหรับภาพของคุณและไม่เสร็จสิ้นกิจกรรม (อาจมีลิงก์ที่ฉันให้) มิฉะนั้นคุณจะต้องสร้างอินสแตนซ์ใหม่ของกิจกรรมและลองคิดดูว่าจะกลับไปที่ใด
codeMagic

ฉันต้องการปุ่มย้อนกลับเพื่อไปที่หน้าจอก่อนหน้า นี่คือชุดของหน้าจอการสอนโดยทั่วไปและผู้ใช้สามารถไปข้างหน้า / ย้อนกลับ แต่ละหน้าจอได้รับการออกแบบและใช้ pngs จำนวนมาก - บางครั้ง pngs ที่ใช้หน้าจอส่วนใหญ่
Lo-Tan

@ Lo-Tan ฉันคิดว่าคุณต้องการแทนที่เมธอด onBackPressed () จากนั้นสร้างกิจกรรมที่คุณต้องการไปด้วยตนเอง จากนั้นคุณสามารถจบรายการที่คุณเปิดและเริ่มต้นรายการก่อนหน้า
Zapnologica

1

ฉันไม่ทราบว่าสิ่งนี้มีประโยชน์หรือไม่ แต่ฉันดิ้นรนกับปัญหาเดียวกันและฉันพบวิธีที่ง่ายมากโดยมีเพียงตัวแปรบูลีนระดับโลกและการดำเนินการ onResume () ในกรณีของฉันกิจกรรม C ของฉันหากคลิกที่ปุ่มใดปุ่มหนึ่งควรทำให้เสร็จ () ของกิจกรรม B!

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 มันจะทำหน้าที่ "onResume ()" ของกิจกรรม B และกลับไปที่กิจกรรม 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);
    }

ลองนี้มันทำงานได้ทั้งบนปุ่มแถบเครื่องมือด้านหลังเป็นปุ่มฮาร์ดแวร์กลับ


อันนี้ใช้ได้สำหรับฉัน ฉันยังมีMainActivityและSettingsActivityด้วยandroid:parentActivityName=".MainActivity"สำหรับอันที่สอง รหัสนี้จัดการกับปุ่มHome / Backใน toolbat และเพิ่งเสร็จสิ้นกิจกรรมปัจจุบันที่กลับไปที่ก่อนหน้านี้ใน stack ขอบคุณ
mortalis

1

เสร็จสิ้นปิดแอปพลิเคชันทั้งหมดนี่คือสิ่งที่ฉันเกลียดในการพัฒนา Android ที่ยังไม่เสร็จซึ่งก็ดี แต่พวกเขาไม่ได้ติดตามด้วยไวยากรณ์ ok ที่พวกเขามี

startActivity(intent)

ทำไมจะไม่ล่ะ

ความใกล้ชิด (เจตนา)?


1
นี่ตอบคำถามหรือไม่ หรือนี่เป็นเพียงข้อเสนอแนะที่จะลอง? ในทั้งสองกรณีพูดจาโผงผางไม่จำเป็นและไม่น่าจะต้อนรับ SO
Gilles Gouaillardet

1

เราพบสถานการณ์ที่คล้ายกันมาก

กิจกรรม 1 (เปิด) -> กิจกรรม 2 (ดูตัวอย่าง) -> กิจกรรม 3 (รายละเอียด)

"ตอบกลับไม่ถูกต้อง" ตอบกลับ

  • อุปกรณ์ที่กดกลับไปที่กิจกรรม 3 จะปิดกิจกรรม 2

ฉันได้ตรวจสอบคำตอบทั้งหมดที่โพสต์ไว้ด้านบนและไม่มีคำตอบใด ๆ เลย ไวยากรณ์ Java สำหรับการเปลี่ยนระหว่างกิจกรรม 2 และกิจกรรม 3 ได้รับการตรวจสอบว่าถูกต้อง

สดจากการเข้ารหัสเมื่อมีการโทรออกแอปของบุคคลที่สาม โดยกิจกรรม เราตัดสินใจตรวจสอบมุมการกำหนดค่า - ในที่สุดทำให้เราสามารถระบุสาเหตุของปัญหาได้

ขอบเขต : การกำหนดค่าของกิจกรรม 2 (ผู้โทร)

สาเหตุหลัก :

android:launchMode="singleInstance"

สารละลาย :

android:launchMode="singleTask"

เห็นได้ชัดว่าเรื่องนี้ "เมื่อกดกลับ" ปัญหาsingleInstanceพิจารณาว่าเรียกใช้กิจกรรมในหนึ่งอินสแตนซ์ที่มีการเรียกกิจกรรมในขณะที่singleTaskจะอนุญาตให้กิจกรรมที่ถูกเรียกใช้มีเอกลักษณ์ของตัวเองเพียงพอสำหรับการกดปุ่มย้อนกลับ


0
{ getApplicationContext.finish();   }

ลองวิธีนี้ ..


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

0

อาจเป็นไปได้ว่าคุณกำลังโทรหา finish (); ในเหตุการณ์ปุ่มคลิกกิจกรรมหลักจะปิดหลังจากที่คุณคลิกปุ่มและเมื่อคุณกลับมาจากกิจกรรมถัดไปแอปพลิเคชันจะถูกออกเนื่องจากกิจกรรมหลักปิดแล้วและไม่มีกิจกรรมที่ใช้งานอยู่


0

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

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

คุณต้องใช้สิ่งนี้ในกิจกรรมหลักของคุณ

 Intent intent = new Intent(context , yourActivity);

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

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

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