Android singleTask หรือ singleInstance เปิดโหมด? [ปิด]


84

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

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

ทั้งโหมดเปิดตัว singleTask และ singelInstance ดูเหมือนจะทำในสิ่งที่ฉันต้องการดังนั้นฉันไม่แน่ใจว่าฉันควรใช้อันไหนเพื่อจุดประสงค์นี้และเพราะอะไร

คำตอบ:


141

จากหน้าความรู้พื้นฐานของแอปพลิเคชันของคู่มือการพัฒนา Android:

โดยค่าเริ่มต้นกิจกรรมทั้งหมดในแอปพลิเคชันจะมีความสัมพันธ์ซึ่งกันและกันนั่นคือมีการตั้งค่าให้กิจกรรมทั้งหมดเป็นงานเดียวกัน

กิจกรรม "singleInstance" เป็นกิจกรรมเดียวในงาน หากกิจกรรมนั้นเริ่มต้นกิจกรรมอื่นกิจกรรมนั้นจะถูกเรียกใช้ในงานอื่นโดยไม่คำนึงถึงโหมดการเปิดใช้งานราวกับว่า FLAG_ACTIVITY_NEW_TASK เป็นไปตามเจตนา ในแง่อื่น ๆ โหมด "singleInstance" จะเหมือนกับ "singleTask"

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

4 กิจกรรมในงาน

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

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

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

นี่คือบล็อกโพสต์ที่ดีสำหรับข้อมูลเพิ่มเติมรวมถึงเครดิตสำหรับรูปภาพ: ชุดกิจกรรมและงาน Android - ข้อมูลเบื้องต้นเกี่ยวกับโมเดลองค์ประกอบ UI ของ Android


4
ขอบคุณ! ดูเหมือนการอ่านที่ดี ... สิ่งที่ iv ตระหนักว่าฉันต้องการหลายอินสแตนซ์ของกิจกรรมและเฉพาะเมื่อกิจกรรมเบื้องหน้าเป็นกิจกรรมการค้นหาและการค้นหาอื่นจะดำเนินการควรใช้กิจกรรมที่มีอยู่นั้น (เช่นวิธีการทำงานของตลาด) และ สำหรับ singeTop นั้นเป็นสิ่งที่ฉันตามมา แต่ขอบคุณสำหรับความช่วยเหลืออย่างไรก็ตาม =) ขอบคุณ
Kman

1
เฮ้ขอบคุณ โพสต์ที่เขียนดีนี้ช่วยฉันได้ในพริบตา
icecreamman

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


30

ด้วยวิธีง่ายๆ -

singleTask:

ระบบจะสร้างงานใหม่และสร้างอินสแตนซ์ของกิจกรรมที่รูทของงานใหม่ อย่างไรก็ตามหากอินสแตนซ์ของกิจกรรมมีอยู่แล้วในงานแยกต่างหากระบบจะกำหนดเส้นทางเจตนาไปยังอินสแตนซ์ที่มีอยู่ผ่านการเรียกonNewIntent()ใช้เมธอดของมันแทนที่จะสร้างอินสแตนซ์ใหม่ one instanceกิจกรรมเท่านั้นที่สามารถมีได้ในแต่ละครั้ง

หมายเหตุ: แม้ว่ากิจกรรมจะเริ่มในงานใหม่ แต่ปุ่มย้อนกลับยังคงส่งคืนผู้ใช้ไปยังกิจกรรมก่อนหน้า

singleInstance-

เช่นเดียวกับการ"singleTask"ยกเว้นว่าระบบไม่ได้เปิดตัวกิจกรรมอื่น ๆ ใด ๆ ที่เป็นงานอินสแตนซ์โฮลดิ้ง กิจกรรมนี้เป็นกิจกรรมเดียวและเป็นสมาชิกเดียวของงาน กิจกรรมใด ๆ ที่ตั้งขึ้นโดยหนึ่งในนี้เปิดในงานที่แยกต่างหาก


4

singleTaskและsingleInstanceกิจกรรมต่างๆสามารถเริ่มงานได้เท่านั้น พวกเขามักจะอยู่ที่รากของกองกิจกรรม ยิ่งไปกว่านั้นอุปกรณ์ยังสามารถเก็บกิจกรรมได้ครั้งละหนึ่งอินสแตนซ์ - เพียงงานเดียวเท่านั้น
นานหุ่นยนต์: launchMode


1
ประโยคสุดท้ายเป็นจริงสำหรับ singleInstance ไม่ใช่ singleTask
Serdar Samancıoğlu

@SerdarS. ขอบคุณความคิดเห็นของคุณ การเพิ่มเติมเกี่ยวกับsingleTask- ระบบจะสร้างงานใหม่และสร้างอินสแตนซ์ของกิจกรรมที่รูทของงานใหม่ อย่างไรก็ตามหากอินสแตนซ์ของกิจกรรมมีอยู่แล้วในงานแยกต่างหากระบบจะกำหนดเส้นทางเจตนาไปยังอินสแตนซ์ที่มีอยู่ผ่านการเรียกonNewIntent()ใช้เมธอดของมันแทนที่จะสร้างอินสแตนซ์ใหม่ กิจกรรมสามารถมีได้ครั้งละหนึ่งอินสแตนซ์เท่านั้น สำหรับdeveloper.android.com
Rupesh Yadav

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