คำอธิบายความเกี่ยวข้องของงาน Android


105

แอตทริบิวต์taskAffinityใช้สำหรับอะไร? ฉันอ่านเอกสารแล้วแต่ไม่เข้าใจมากนัก

ใครสามารถอธิบายความสัมพันธ์ของงานในแง่คนธรรมดาได้ไหม


1
นี่คือคำอธิบายที่ดีมากพร้อมตัวอย่าง: slideshare.net/RanNachmany/…
user1269737

ฉันคิดว่าคำตอบนี้ดีที่สุด: stackoverflow.com/a/21383301/1318946
Pratik Butani

คำตอบ:


160

Android Task Affinity ใช้ทำอะไร

แอปพลิเคชัน Android มีกิจกรรมที่รวมกันเป็นกอง ๆ เหมือนสำรับไพ่ หากคุณเริ่มแอปพลิเคชัน Android และเริ่มกิจกรรม 5 อย่าง A, B, C, D, E พวกมันจะรวมตัวกันเป็นกอง

E   - chat view
D   - weather screen
C   - map view
B   - weather screen
A   - login screen

E เป็นกิจกรรมสุดท้ายที่จะเริ่มต้นและกำลังแสดงอยู่ ถ้าคุณปิด E D จะแสดง หากคุณปิด D C จะแสดงขึ้น เป็นต้น

สังเกตว่ากิจกรรมBและDเป็นกิจกรรมเดียวกัน จะเกิดอะไรขึ้นถ้าผู้ใช้ทำการแก้ไขบางอย่างD weather screenแล้วตัดสินใจปิดกิจกรรมแล้วปิดC Map view?

จากนั้นผู้ใช้จะกลับมาที่หน้าจอสภาพอากาศและผู้ใช้จะไม่มีความสุขเพราะการเปลี่ยนแปลงที่เกิดขึ้นในระดับที่ไม่ได้ถูกบันทึกไว้ในระดับD weather screen B weather screenแม้ว่าจะเป็นกิจกรรมเดียวกัน แต่ก็เป็น STATE ที่แตกต่างกันของกิจกรรมนั้น

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

โดยปกติผู้ใช้มักไม่คิดในแง่ของการจัดกิจกรรมที่เข้มงวด พวกเขาคิดว่า: "โอ้มุมมองสภาพอากาศฉันจะเปลี่ยนแปลงตรงนั้น" จากนั้นพวกเขาก็ต้องการกลับไปที่มุมมองแผนที่ จากนั้นสำรองข้อมูลอีกครั้งเพราะต้องการกลับไปที่หน้าจอเข้าสู่ระบบ ทำไมB weather appการแสดงและทำไมมันไม่ได้บันทึกการตั้งค่าจากระดับD?

โปรแกรมเมอร์อาจสามารถบรรเทาความสับสนได้หากมีกิจกรรมBและDเชื่อมโยงอยู่ในสถานะ วิธีนั้นเปลี่ยนไปเป็นการเปลี่ยนอีกแบบ ทุกครั้งที่ผู้ใช้เปิดหน้าจอสภาพอากาศใหม่ผู้ใช้จะแอบเปิดหน้าจอสภาพอากาศเพียงครั้งเดียว

ในสถานการณ์เช่นนี้การเปลี่ยน taskAffinity ของกิจกรรมอาจเป็นสิ่งที่พึงปรารถนา ผู้ใช้จะเปลี่ยนระดับ D จากนั้นสำรองข้อมูลไปที่ระดับ B และดูการเปลี่ยนแปลงใน B ที่ทำกับ D

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

สไลด์โชว์พร้อมคำอธิบายเพิ่มเติม: http://www.slideshare.net/RanNachmany/manipulating-android-tasks-and-back-stack


13
แล้วถ้าใช้singleInstanceแทนการใช้taskAffinity?
hguser

5
ในกรณีที่อธิบายไว้ข้างต้นฉันต้องการใช้ Intent.FLAG_ACTIVITY_REORDER_TO_FRONT เป็นธงในกิจกรรมการเรียกเจตนา D ซึ่งจะทำให้กิจกรรม B อยู่เหนือกิจกรรมอื่น ๆ ทั้งหมดและเก็บไว้เพียงตัวอย่างเดียว
EyalBellisha

66
อันที่จริงคำตอบนี้แทบจะไม่ได้สัมผัสtaskAffinityเลย :-( คำอธิบายคลุมเครือน่าทึ่งที่คำตอบเหล่านี้ได้รับคะแนนโหวตเพิ่มขึ้นมากมาย
David Wasser

6
คำตอบที่ยาวมาก แต่ยังไม่ได้กล่าวถึงข้อเท็จจริงง่ายๆ: taskAffinityใช้เพื่อระบุชื่อของงานที่กิจกรรมต้องการให้รันเมื่อIntentมีแฟล็FLAG_ACTIVITY_NEW_TASKกกิจกรรมจะถูกใส่ลงในงานนี้โดยเฉพาะ (กำหนดโดยtaskAffinity)
Stan Mots

3
Although it's the same activity, it's a different STATE of that activity.ฉันจะบอกว่า "มันเป็นอีกตัวอย่างหนึ่งของกิจกรรมนั้น"
Maksim Dmitriev

6

ความสัมพันธ์ระบุว่ากิจกรรมใดที่ต้องการเป็นของงาน

ความสัมพันธ์เข้ามามีบทบาทในสองสถานการณ์:

เมื่อเจตนาที่เริ่มต้นกิจกรรมมีแฟล็ก FLAG_ACTIVITY_NEW_TASK

เมื่อกิจกรรมมีแอตทริบิวต์ allowTaskReparenting ตั้งค่าเป็น "true"

โปรดดูที่http://developer.android.com/guide/components/tasks-and-back-stack.html


28
ขอขอบคุณสำหรับการคัดลอกจาก developer.android.com
Anirban

สิ่งนี้ไม่ได้อธิบายอะไร หมายความว่าอย่างไรในทางปฏิบัติ?
James Andrews

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