จะป้องกันการกลับไปทำกิจกรรมก่อนหน้าได้อย่างไร?


210

เมื่อกดปุ่ม BACK บนโทรศัพท์ฉันต้องการป้องกันกิจกรรมบางอย่างไม่ให้กลับไปที่กิจกรรมก่อนหน้า

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

ฉันลองใช้Intent.FLAG_ACTIVITY_NO_HISTORYแต่เนื่องจากแอปพลิเคชันมีการรวม Facebook เมื่อมีการใช้ 'เข้าสู่ระบบด้วย Facebook' Facebook ควรกลับไปที่หน้าจอเข้าสู่ระบบเริ่มต้นดังนั้นฉันควรเก็บประวัติกิจกรรมเหล่านี้ไว้

ฉันคิดว่าจะเอาชนะพฤติกรรมของปุ่ม BACK HomeScreenเพื่อสิ้นสุดแอปพลิเคชันโดยตรงเมื่อกดปุ่มและใช้งาน

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

แต่นั่นก็ไม่ได้ผลเช่นกัน


1
เพียงชี้แจงคุณพยายามจับพฤติกรรมกลับสำหรับทุกคนยกเว้น facebook?
havexz

2
ในแง่หนึ่งก็ใช่ แต่จริงๆแล้วสิ่งที่ฉันต้องการคือหลังจากการเข้าสู่ระบบที่ประสบความสำเร็จเกิดขึ้นและ HomeScreen เปิดขึ้นผู้ใช้จะไม่สามารถกลับไปที่หน้าจอเข้าสู่ระบบได้โดยกดปุ่ม BACK เช่นเดียวกับ Twitter หรือ Foursquare เช่นเมื่อเราลงชื่อเข้าใช้แอพเหล่านั้นเราจะไม่เห็นหน้าเข้าสู่ระบบจนกว่าเราจะออกจากระบบ (แม้ว่าเราจะกด BACK หลังจากเข้าสู่ระบบ)
ecem

คำตอบ:


345

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


2
หากฉันต้องการให้เธรดในกิจกรรมก่อนหน้ายังคงทำงานอยู่
AlleyOOP

2
คุณไม่ต้องการไปกับแนวทางของฉันในตอนนั้น การโทรเสร็จสิ้น () กำลังจะฆ่ากิจกรรม คุณสามารถเริ่มกระบวนการของคุณที่คุณต้องการเรียกใช้ในกิจกรรมที่คุณกำลังจะไปได้หรือไม่?
coder

7
หมายเหตุ: หากคุณโทรหาfinishในช่วงการเปลี่ยนภาพที่แชร์คุณอาจตกเลือดจากกิจกรรมก่อนหน้านี้ เช่นหากคุณมีHomeActivity-> IntermediateActivity-> FinalActivityและคุณโทรfinish()เข้ามาIntermediateActivityทันทีหลังจากเริ่มต้นFinalActivityคุณจะเห็นHomeActivityช่วงเวลาสั้น ๆ
David Murdoch

101

การแก้ปัญหาต่อไปนี้มีประโยชน์มากในสถานการณ์การเข้าสู่ระบบ / กิจกรรมหลักปกติหรือการใช้หน้าจอการบล็อก

ในการย่อขนาดแอปให้เล็กลงแทนที่จะกลับไปที่กิจกรรมก่อนหน้าคุณสามารถแทนที่onBackPressed()ดังนี้:

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

moveTaskToBack(boolean nonRoot)ปล่อยให้กองหลังของคุณเป็นเพียงแค่ทำให้งานของคุณ (กิจกรรมทั้งหมด) เป็นพื้นหลัง เช่นเดียวกับกรณีที่ผู้ใช้กดปุ่ม Home

พารามิเตอร์boolean nonRoot- หากเป็นเท็จจะใช้งานได้ก็ต่อเมื่อกิจกรรมนั้นเป็นรากของงาน ถ้าเป็นจริงมันจะใช้ได้กับกิจกรรมใด ๆ ในงาน


3
สมบูรณ์แบบสำหรับหน้าจอเข้าสู่ระบบเพราะมันทำให้ประวัติยังคงเหมือนเดิม
Hackmodford

ขอบคุณฉันพยายามค้นหามันประมาณสามวัน เนื่องจาก android: noHistory = "จริง" การตั้งค่าสถานะสำหรับกิจกรรมไม่ทำงานตามที่คาดไว้ (การตั้งค่าสถานะ noHistory จะสร้างกิจกรรมหลังจากย่อเล็กสุด) และเสร็จสิ้น () บางครั้งไม่ทำงานสำหรับฉัน แต่ทำไมฉันจึงยังไม่เข้าใจ
Denshov

37

ฉันไม่แน่ใจว่าสิ่งที่คุณต้องการ แต่ดูเหมือนว่ามันควรจะเป็นไปได้และมันก็ดูเหมือนว่าคุณกำลังถูกแล้ว

ต่อไปนี้เป็นลิงค์บางส่วนที่อาจช่วยได้:

ปิดการใช้งานปุ่มย้อนกลับใน Android

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

       return;
    }

ฉันจะปิดใช้งาน 'ย้อนกลับ' กับกิจกรรมบางอย่างได้อย่างไร

  AndroidManifest.xml =>
<activity android:name=".SplashActivity" android:noHistory="true"/>

1
ฉันไม่สามารถใช้ตัวเลือก noHistory เนื่องจากปัญหา Facebook ที่ฉันพยายามอธิบายในคำถามของฉันและเป็นหนึ่งในความคิดเห็น แต่สิ่งที่มีปุ่ม BACK ไม่ได้ปิดการใช้งาน แต่การทำให้ออกจากแอปพลิเคชันทั้งหมดเช่นSystem.exit(0)นั้นเรียกว่า (ฉันรู้ว่ามันไม่ใช่วิธีการปฏิบัติที่ดีที่สุด แต่ฉันแค่อยากจะยกตัวอย่าง)
ecem

ขอบคุณมันใช้งานได้ดี ข้อเสนอแนะเท่านั้นที่ฉันทำที่นี่จะเป็นไม่จำเป็นต้องกลับมา เพียงแค่เอา super.onBackPressed (); และปล่อยให้วิธีการที่ว่างเปล่า ใช้งานได้ดีเช่นกัน
hyperCoder

20

มีสองวิธีแก้ปัญหาสำหรับกรณีของคุณกิจกรรม A เริ่มกิจกรรม B แต่คุณไม่ต้องการกลับไปที่กิจกรรม A ในกิจกรรม B

1. ลบกิจกรรมก่อนหน้า A ออกจาก back stack

    Intent intent = new Intent(activityA.this, activityB.class);
    startActivity(intent);
    finish(); // Destroy activity A and not exist in Back stack

2. ปิดการทำงานของปุ่มย้อนกลับในกิจกรรม B

มีสองวิธีในการป้องกันเหตุการณ์ย้อนกลับดังนี้

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);
}

หวังว่ามันจะมีประโยชน์ แต่ก็ยังขึ้นอยู่กับสถานการณ์ของคุณ


3
การปิดใช้งาน onBackPressed () เป็นเรื่องที่ไม่เลวหรือไม่
C. Skjerdal

มันขึ้นอยู่กับสิ่งที่คุณพยายามทำโดยสิ้นเชิงในแอปพลิเคชั่นที่ใช้งานได้ต้องการสิ่งนี้
3099225

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

8

เนื่องจากมีวิธีแก้ปัญหาที่ยอดเยี่ยมมากมายที่แนะนำอยู่ให้ลองพยายามอธิบายเพิ่มเติม

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

ลบกิจกรรมก่อนหน้าออกจาก Backstack ง่าย

วิธีลบกิจกรรมก่อนหน้าจาก Backstack

โทร finish()วิธีการ

การไหลปกติ:

ป้อนคำอธิบายรูปภาพที่นี่
กิจกรรมทั้งหมดจะถูกเก็บไว้ในกองที่รู้จักกันในชื่อแบ็คสแต็ค
เมื่อคุณเริ่มกิจกรรมใหม่ ( startActivity(...)) กิจกรรมใหม่จะถูกผลักไปที่ด้านบนสุดของสแต็กและเมื่อคุณกดปุ่มย้อนกลับกิจกรรมจะถูกดึงจากสแต็ก
จุดสำคัญหนึ่งที่ควรทราบก็คือเมื่อกดปุ่มย้อนกลับแล้วfinish();วิธีการที่เรียกว่าภายใน นี่เป็นพฤติกรรมเริ่มต้นของวิธีการ onBackPressed ()

ดังนั้นหากคุณต้องการข้ามกิจกรรม B

เช่น A <--- C

เพียงเพิ่มfinish();วิธีการหลังจากที่คุณstartActvity(...)อยู่ในกิจกรรม B

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

ป้อนคำอธิบายรูปภาพที่นี่


6

finish()ให้วิธีการในการปิดกิจกรรมปัจจุบันไม่ใช่แอปพลิเคชันทั้งหมด และคุณควรอย่าพยายามหาวิธีฆ่าแอปพลิเคชั่น คำแนะนำเล็ก ๆ น้อย ๆ

คุณได้ลองเชื่อมโยงของIntent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS | Intent.FLAG_ACTIVITY_NO_HISTORY? อย่าลืมใช้ธงนี้ในIntentกิจกรรมเริ่มต้น!


2
FLAG_ACTIVITY_NO_HISTORYป้องกันไม่ให้ LoginScreen ของฉันจับการติดต่อกลับของ Facebook เมื่อใช้เข้าสู่ระบบด้วย Facebook เพราะเมื่อโฟกัสออกไปจากหน้าจอ LoginScreen จะไม่สามารถดำเนินการต่อได้ (เนื่องจากไม่มีประวัติ) แต่ฉันไม่ได้ลองด้วยIntent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTSฉันจะตรวจสอบขอบคุณ!
ecem

ขอบคุณมากเกี่ยวกับfinish()วิธีการฉันไม่รู้เกี่ยวกับมัน
ecem

4

ใส่finish()หลังจาก

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

1
นี่คือสิ่งที่เป็นคำตอบที่ได้รับการยอมรับเมื่อสี่ปีก่อน
TylerH

3

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



3

วิธีนี้ใช้งานได้ดี

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

เพียงแทนที่วิธี 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
@Override
public void onBackPressed() {
}

เมื่อคุณสร้างonBackPressed()เพียงแค่ลบsuper.onBackPressed();และที่ควรจะทำงาน


1

ใส่

finish();

ทันทีหลังจาก ActivityStart เพื่อหยุดกิจกรรมป้องกันไม่ให้กลับไปที่กิจกรรม จากนั้นเพิ่ม

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

เพื่อกิจกรรมที่คุณกำลังเริ่มต้น

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