จะนำกิจกรรมไปยังเบื้องหน้า (ด้านบนของกองซ้อน) ได้อย่างไร?


91

ใน Android ฉันกำหนดกิจกรรม ExampleActivity

เมื่อใบสมัครของฉันได้รับการเปิดตัวเป็นตัวอย่างของนี้ AA-กิจกรรมสร้างบอกว่ามันเป็น เมื่อผู้ใช้คลิกปุ่มในAB-Activity อื่น B ​​ถูกสร้างขึ้น ตอนนี้กองงานคือ BA โดยที่ B อยู่ด้านบน จากนั้นผู้ใช้คลิกปุ่มบน B สร้าง C-Activity อื่นและ C ถูกสร้างขึ้น ตอนนี้กองงานคือ CBA โดยมี C อยู่ด้านบน

ตอนนี้เมื่อผู้ใช้คลิกปุ่มบน C ฉันต้องการให้แอปพลิเคชันนำ A ไปที่พื้นหน้าเช่นทำให้ A อยู่ที่ด้านบนสุดของกองงาน ACB

ฉันจะเขียนโค้ดให้มันเกิดขึ้นได้อย่างไร?

คำตอบ:


109

คุณสามารถลองสิ่งนี้FLAG_ACTIVITY_REORDER_TO_FRONT(เอกสารอธิบายสิ่งที่คุณต้องการ)


3
ผมคิดว่ามันควรจะเป็นFLAG_ACTIVITY_SINGLE_TOP

26
@ user942821 FLAG_ACTIVITY_SINGLE_TOPจะไม่ช่วยตรงนี้ เมื่อ ActivityC อยู่ด้านบนสุดของสแต็กและเรียกใช้startActivity()เพื่อเรียกใช้ ActivityA แม้ว่าคุณจะตั้งค่าFLAG_ACTIVITY_SINGLE_TOPไว้จะยังคงสร้างอินสแตนซ์ใหม่ของ ActivityA FLAG_ACTIVITY_SINGLE_TOPป้องกันการสร้างอินสแตนซ์ใหม่เท่านั้นหากคุณกำลังพยายามเปิดกิจกรรมที่อยู่ด้านบนสุดของสแต็ก ในกรณีนี้ ActivityA ไม่ได้อยู่ที่ด้านบนสุดของสแต็กดังนั้น Android จึงสร้างอินสแตนซ์ใหม่
David Wasser

6
สุดยอด! ที่ใช้(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT | Intent.FLAG_ACTIVITY_CLEAR_TOP)ในการล้างประวัติใด ๆ Activityหลังจากที่ได้รับ
shkschneider

10
FLAG_ACTIVITY_REORDER_TO_FRONT จะถูกละเว้นหากคุณระบุ FLAG_ACTIVITY_CLEAR_TOP ด้วย ตรวจสอบเอกสาร
Kris Subramanian

3
เจตนา. addFlags (Intent.FLAG_ACTIVITY_REORDER_TO_FRONT | Intent.FLAG_ACTIVITY_SINGLE_TOP) วิธีนี้จะได้ผลดีหากคุณต้องการนำกิจกรรมของคุณมาแสดงพร้อมกับเซสชันผู้ใช้หากกิจกรรมนั้นอยู่ด้านบนของแบ็คสแต็ก แต่ไม่อยู่ด้านหน้า
Hassan Jamil

64

วิธีที่ดีที่สุดที่ฉันพบคือใช้จุดประสงค์เดียวกันกับที่หน้าจอหลักของ Android ใช้นั่นคือเครื่องเรียกใช้งานแอป

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

Intent i = new Intent(this, MyMainActivity.class);
i.setAction(Intent.ACTION_MAIN);
i.addCategory(Intent.CATEGORY_LAUNCHER);
startActivity(i);

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


2
ขอบคุณมากสำหรับโค้ดชิ้นนั้น ฉันเสียเวลาหลายชั่วโมงในการพยายามทำให้มันทำงานได้อย่างถูกต้อง
PakitoV

3
หรือไม่มี ComponentName และ setComponent แต่มี Intent ใหม่ (นี่คือ MyMainActivity.class)
Tima

3
แปลกเพราะนี่เป็นสิ่งเดียวที่เหมาะกับฉัน การตั้งค่าแฟล็กใช้ไม่ได้และสร้างกิจกรรมใหม่เสมอ
Steven Huang

5
เมื่อฉันอ่านคำตอบและความคิดเห็นนี้เป็นที่ชัดเจนว่าเรามีความเข้าใจผิด คำถามเดิมคือถามเกี่ยวกับวิธีการจัดเรียงActivityภายในกองงานใหม่ OP ระบุอย่างชัดเจนว่าเขาต้องการย้ายActivityAจากด้านล่างสุดของสแต็กไปที่ด้านบนสุดของสแต็ก (กล่าวคือเขาต้องการเรียงลำดับ ActivityA ไปที่ด้านหน้าของสแต็กงาน ) คำตอบนี้จะไม่ทำเช่นนั้น คำตอบนี้เป็นคำตอบสำหรับคำถาม"ฉันจะนำแอปพลิเคชันของฉัน (กองงาน) จากพื้นหลังไปสู่พื้นหน้าได้อย่างไร นั่นเป็นคำถามที่แตกต่างจากคำถามเดิมของ OP อย่างสิ้นเชิง
David Wasser

3
ปุ่มเพิ่มคะแนนยังระบุว่า "คำตอบนี้มีประโยชน์" ไม่ใช่ "คำตอบนี้มีประโยชน์ต่อผู้ปฏิบัติงาน" - เขา / เธอมี "เครื่องหมายยอมรับ" สำหรับสถานการณ์นี้แล้ว เห็นได้ชัดว่าฉันไม่รู้ว่าอะไรเป็นประโยชน์สำหรับ op และ IMHO ก็ลดคะแนนคำตอบตามการคาดเดาของฉันว่าอะไรเป็นประโยชน์สำหรับ op นั้นไม่ถูกต้อง
Boris Treukhov

28

นี่คือตัวอย่างโค้ดที่คุณสามารถทำได้:

Intent intent = getIntent(getApplicationContext(), A.class)

วิธีนี้จะทำให้แน่ใจว่าคุณมีกิจกรรมในสแต็กเพียงอินสแตนซ์เดียว

private static Intent getIntent(Context context, Class<?> cls) {
    Intent intent = new Intent(context, cls);
    intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
    return intent;
}

11

FLAG_ACTIVITY_REORDER_TO_FRONT : หากตั้งค่าใน Intent ส่งไปยัง Context.startActivity () แฟล็กนี้จะทำให้กิจกรรมที่เรียกใช้ถูกนำไปที่ด้านหน้าของสแต็กประวัติของงานหากรันอยู่แล้ว

Intent i = new Intent(context, AActivity.class);
i.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
startActivity(i);

4

ฉันคิดว่าการรวมกันของIntentธงควรเป็นเคล็ดลับ โดยเฉพาะอย่างยิ่งและIntent.FLAG_ACTIVITY_CLEAR_TOPIntent.FLAG_ACTIVITY_NEW_TASK

เพิ่มแฟล็กเหล่านี้ตามเจตนาของคุณก่อนโทร startActvityเพิ่มธงเหล่านี้เพื่อเจตนาของคุณก่อนที่จะเรียก


2

i.setFlags(Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT);

หมายเหตุโหมดเรียกใช้ homeactivity ของคุณควรเป็น single_task


1

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

ฉันแน่ใจว่าคุณเคยเห็นหน้านี้ แต่เพื่อความสะดวกของคุณลิงค์นี้


0

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

วิธีแก้ปัญหาสำหรับฉันคือการสร้างเครื่องรับสัญญาณที่รับฟังการออกอากาศที่การแจ้งเตือนเรียกใช้ โดยพื้นฐานแล้ว:

  1. การแจ้งเตือนจะทริกเกอร์การดำเนินการออกอากาศพร้อมด้วยชื่อพิเศษของกิจกรรมที่จะเปิด

  2. ตัวรับการออกอากาศจับสิ่งนี้เมื่อมีการคลิกการแจ้งเตือนจากนั้นสร้างความตั้งใจที่จะเปิดกิจกรรมนั้นโดยใช้แฟล็ก FLAG_ACTIVITY_REORDER_TO_FRONT

  3. กิจกรรมจะถูกนำไปที่ด้านบนสุดของสแต็กกิจกรรมโดยไม่มีรายการที่ซ้ำกัน


-2

หากคุณใช้ "Google Cloud Message" เพื่อรับการแจ้งเตือนแบบพุชด้วยคลาส "PendingIntent" รหัสต่อไปนี้จะแสดงการแจ้งเตือนในแถบการทำงานเท่านั้น

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

Intent notificationIntent = new Intent(this, ActBase.class); **notificationIntent.setAction(Intent.ACTION_MAIN); notificationIntent.addCategory(Intent.CATEGORY_LAUNCHER);** PendingIntent contentIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);

NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this) .setSmallIcon(R.drawable.ic_launcher) .setContentTitle("Localtaxi") .setVibrate(vibrate) .setStyle(new NotificationCompat.BigTextStyle().bigText(msg)) .setAutoCancel(true) .setOnlyAlertOnce(true) .setContentText(msg);

mBuilder.setContentIntent(contentIntent);

NotificationManager mNotificationManager = (NotificationManager) this.getSystemService(Context.NOTIFICATION_SERVICE);

mNotificationManager.notify(NOTIFICATION_ID, mBuilder.build());

เชี่ยว!

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