Android: เปิดกิจกรรมโดยไม่บันทึกลงในสแต็ก


94

ฉันมีกิจกรรม 2 อย่างคือหลักและรายการ

จากหน้าหลักคุณสามารถเปิดรายการ จากรายการคุณสามารถเปิด Main

ฉันต้องการให้ทุกครั้งที่เปิดรายการไม่ได้รับการบันทึกลงใน 'ประวัติ' ดังนั้นการกดกลับจาก Main จึงไม่สามารถกลับไปที่ List

เป็นไปได้ไหม?


11
หาก 'รายการ' เริ่ม 'หลัก' ให้เรียกfinish()ทันทีหลังจากstartActivity(...)นั้น ด้วยวิธีนี้หากผู้ใช้กด BACK จาก 'main' จะไม่มีอะไรให้ย้อนกลับไป
Squonk

นี่คือการนำทางเพื่อการแจ้งเตือน แต่แนวคิดอาจเกี่ยวข้องกับdeveloper.android.com/guide/topics/ui/notifiers/…
Kevin Lee

คำตอบ:


160

เมื่อเริ่มรายการของคุณActivityให้ตั้งค่าIntentสถานะดังนี้:

Intent i = new Intent(...); // Your list's Intent
i.setFlags(i.getFlags() | Intent.FLAG_ACTIVITY_NO_HISTORY); // Adds the FLAG_ACTIVITY_NO_HISTORY flag
startActivity(i);

FLAG_ACTIVITY_NO_HISTORYธงเก็บใหม่Activityจากการเพิ่มไปยังกองประวัติศาสตร์

หมายเหตุ: ตามที่ @Sam ชี้ให้เห็นคุณสามารถใช้i.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);แทนได้ ไม่มีความแตกต่างในการทำงาน


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

แน่นอน. น่าเสียดายที่ไม่มีทางหลีกเลี่ยงสิ่งนั้นได้ ไม่มีIntentธงที่ระบุว่า "เพิ่มในประวัติศาสตร์เท่านั้นหากไม่กลับไปที่Activityต้นกำเนิด"
Eric

1
ไม่ แต่แฟล็ก FLAG_ACTIVITY_NEW_TASK จะทำงานรายการกิจกรรมจะถูกเพิ่มลงในประวัติ แต่จะอยู่ด้านบนเสมอดังนั้นการกดย้อนกลับจากกิจกรรมหลักจะไม่แสดงรายการกิจกรรม
VinceFR

7
มีเหตุผลใด ๆ ที่คุณใช้setFlags()กับgetFlags()แทนIntent.addFlags()?
แซม

1
@VinceFR มันคือสิ่งที่ฉันต้องการ! a -> b -> c และส่งกลับโดยตรงที่ c-
realtebo

90

ในไฟล์รายการเพิ่ม:

android:noHistory="true" 

ไปยังกิจกรรมที่คุณไม่ต้องการเก็บไว้ในสแต็ก


มีความแตกต่างจากการเริ่มกิจกรรมด้วย flag no_history หรือไม่?
realtebo

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

@MarcinS. เมื่อแอพไม่อยู่ในรายการแอพล่าสุดมันจะไม่ทำงาน คุณช่วยอธิบายได้ไหมว่าทำไมสิ่งนี้จึงเกิดขึ้น
Ajit Kumar Dubey

1
ดังนั้นความแตกต่างระหว่าง 2 แนวทาง (manifest และ flag) คืออะไร?
pumbosha

@pumbosha วิธีการ Manifest จะทำให้กิจกรรมออกจากประวัติศาสตร์เสมอ วิธีการตั้งค่าสถานะช่วยให้คุณสามารถควบคุมพฤติกรรมนั้นในขณะรันไทม์
John Crawford

28

ใช้งานใหม่ด้วยการหักบัญชี สิ่งนี้ใช้ได้ผลในกรณีของฉันเมื่อตัวเลือกอื่นไม่ได้

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);

ล้างสแต็กประวัติทั้งหมดและเริ่มกิจกรรมใหม่บน Android


1
สิ่งนี้จะดีมาก แต่มีวิธีหยุดภาพเคลื่อนไหว "เปลี่ยนงาน" ที่กำลังกวาดอยู่ของระบบหรือไม่ การเพิ่ม FLAG_ACTIVITY_NO_ANIMATION ไม่ได้เป็นการป้องกัน แต่น่าเสียดาย!
androidguy

สิ่งนี้มีผลต่อความเร็วของแอปพลิเคชันหรือไม่
Acauã Pitta

23

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

ตัวอย่างเช่น:

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

หากโทรศัพท์ของคุณไม่เร็วมากคุณจะเห็นว่ากิจกรรมก่อนหน้านี้กำลังเคลื่อนที่
Nolan

@ โนแลนนั่นก็ต่อเมื่อคุณทำเสร็จก่อนเริ่มกิจกรรม
Henrik Bøgelund Lavstsen

7

ในกรณีเฉพาะของฉันFLAG_ACTIVITY_NO_HISTORYไม่ได้ผล ไม่ได้ทำงานด้วยตัวเองFLAG_ACTIVITY_NEW_TASKหรือFLAG_ACTIVITY_CLEAR_TASKคนเดียว

อย่างไรก็ตามFLAG_ACTIVITY_NEW_TASKและFLAG_ACTIVITY_CLEAR_TASKร่วมกันได้ผล

Intent intent = new Intent(FooActivity.this, MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);

4

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

ตัวเลือกที่ 1 - เพียงกิจกรรมเดียวนี้ไม่ควรมีประวัติการโทร

จากนั้นทำ:

Intent i = new Intent(...);
i.addFlag(Intent.FLAG_ACTIVITY_NO_HISTORY);
startActivity(i);

ตัวเลือกที่ 2 - กิจกรรมทั้งหมดที่เริ่มต้นจากกิจกรรมเฉพาะนั้นไม่ควรมีประวัติ

จากนั้นเพิ่มรายการของกิจกรรมการโทร:

android:noHistory="true" 

แต่ถ้าคุณต้องการมีประวัติในกิจกรรมใหม่คุณต้องลบแฟล็กด้วยตนเอง:

Intent i = new Intent(...);
i.removeFlag(Intent.FLAG_ACTIVITY_NO_HISTORY);
startActivity(i);

หวังว่าจะกระจ่างคำตอบอื่น ๆ :)


3

แค่อยากจะเพิ่มวิธีทำใน Kotlin:

val i = Intent(this, LogInActivity::class.java)
startActivity(i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK))

2
เพิ่มเติมจากทาง Kotlin: Intent(this, MainActivity::class.java).apply { addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK) }.also { startActivity(it) }
4ndro1d



-4

คุณไม่สามารถลบล้างปุ่มย้อนกลับของกิจกรรมนั้น ๆ เพื่อหยุดการทำงานของ 'ส่งคืน' ได้หรือไม่?

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

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

6
อย่าทำแบบนี้ เป็นที่ยอมรับในการสกัดกั้น BACK เพื่อวัตถุประสงค์เฉพาะ แต่การทำเพื่อใช้กด BACK อย่างเงียบ ๆ และการป้องกันการยุติการใช้งานActivityถือเป็นแนวทางปฏิบัติที่ไม่ดี
Squonk

1
เห็นด้วยอย่างยิ่ง ^ เป็นเพียงตัวเลือก
Broak

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