Android: อะไรจะดีไปกว่ากัน - กิจกรรมที่หลากหลายหรือเปลี่ยนมุมมองด้วยตนเอง


115

ฉันได้พัฒนาแอพสำหรับ Android แล้วและคำถามนี้ยังคงมีอยู่เสมอ:

ฉันควรจัดโครงสร้าง UI ของฉันอย่างไร ฉันควรเปิดกิจกรรมหลังทำกิจกรรมและออกจากโทรศัพท์เพื่อสร้างปุ่ม "ย้อนกลับ" หรือฉันควรเลือกที่ปรับให้เหมาะสมกว่า แต่ซับซ้อนกว่าในการใช้งานวิธีเปลี่ยนมุมมองด้วยตนเองจากนั้นใช้ฟังก์ชันปุ่ม "ย้อนกลับ" ด้วยตนเอง

คุณคิดว่า (หรือรู้) แนวทางปฏิบัติที่ดีกว่าคืออะไร?


4
สำหรับผู้อ่านใหม่โปรดทราบว่าคำถามนี้ค่อนข้างเก่าและในปัจจุบันคำถามนี้มีแนวโน้มที่จะเป็น "ส่วนย่อยหลายรายการหรือหลายกิจกรรม" มากกว่า "การดูหลายรายการหรือหลายกิจกรรม" ดูที่การปรับปรุงในstackoverflow.com/a/10794086/199364 นอกจากนี้ Google สำหรับหัวข้อ stackoverflow อื่น ๆ เกี่ยวกับเศษและกิจกรรม - คำตอบที่ดีมากมาย
ToolmakerSteve

คำตอบ:


99

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

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

นอกจากนี้ฉันคิดว่ามันเป็นการบอกว่าหลักเกณฑ์ของ Android สำหรับกิจกรรมและการออกแบบงานไม่ได้กล่าวถึงการสลับมุมมองเลย โดยมีศูนย์กลางอยู่ที่การออกแบบ Activity-as-View


5
เมื่อเร็ว ๆ นี้ฉันได้เห็นแอปที่ยอดเยี่ยมบางแอป (เช่น Pulse) ที่ใช้ภาพเคลื่อนไหวและการถ่ายโอนระหว่างมุมมองที่แตกต่างกันอย่างราบรื่นทั้งหมดนี้อยู่ในกิจกรรมเดียว
Danail

3
ฉันเห็นด้วยกับคุณ แต่เอฟเฟกต์ภาพจำนวนมากสามารถใช้ได้ระหว่างการเปลี่ยนมุมมองเท่านั้นและไม่ใช่ระหว่างกิจกรรมที่ทำให้เกิดปัญหาระหว่าง ergo และการเข้ารหัสที่ดี
AsTeR

นี่เป็นหัวข้อที่น่าสนใจอย่างยิ่ง ณ จุดนี้มีแอพที่จะใช้งานมุมมอง 4 มุมมองในที่สุด ฉันกำลังทำมันทั้งหมดภายใน 1 กิจกรรมซึ่งทำให้เกิด "กิจกรรมหลัก" ที่ระบุไว้ในคำตอบนี้ ฉันทำมันเพื่อทำให้แอปของฉันดูและรู้สึกเหมือนเป็นของ iOS เป็นหลัก ฉันยอมรับว่ามันยากขึ้นอยู่กับสิ่งที่คุณพยายามทำให้สำเร็จ คำถามและคำตอบที่ยอดเยี่ยม +1 :-)
trumpetlicks

การสร้าง UI ของ iOS เป็นความคิดที่ไม่ดี Hvis เพียงอย่างเดียวเป็นเหตุผลที่ไม่ถูกต้องที่จะไม่ใช้หลายกิจกรรม
slott

3
@ แดเนียล: เมื่อฉันเปลี่ยนไปใช้วิธีการส่งผ่านวัตถุที่เร็วขึ้นความเร็วในการเปิดตัวกิจกรรมเพิ่มขึ้นอย่างมาก คุณช่วยให้รายละเอียดเพิ่มเติมหรือข้อมูลอ้างอิงสำหรับเรื่องเดียวกันนี้ได้หรือไม่
Bhargav Jhaveri

21

ฉันต้องการชี้ให้เห็นบางกรณีเมื่อกิจกรรมเดียวอาจได้รับการออกแบบที่ดีกว่าสำหรับแอปพลิเคชัน Android ที่มีมุมมองแบบเต็มหน้าจอมากกว่าหนึ่งครั้ง:

  • หากหน้าจอแอพพลิเคชั่นประกบกันอย่างแน่นหนาและแชร์ Object ทั่วไปที่พวกมันทั้งหมดกำลังทำงานอยู่ ในกรณีนี้การส่งผ่าน Object อาจต้องใช้ Bundle และอาจเกิดข้อผิดพลาดได้ง่ายเนื่องจากจะมีสำเนาของมัน เป็นตัวอย่างที่ดีอาจจะเป็นตัวช่วยสร้าง ใช่คุณสามารถใช้ Static เพื่อเข้าถึง Object ทั่วไปได้ แต่แบบคงที่อาจเป็นอันตรายได้ใน Android (คิดว่ามีการเปลี่ยนแปลงการกำหนดค่า!)

  • หากคุณต้องการภาพเคลื่อนไหวที่ยอดเยี่ยมระหว่างหน้าจอ บางทีคุณอาจต้องการให้นกบินในหน้าจอหนึ่งและลงจอดในหน้าจออื่น ลองทำเมื่อแต่ละหน้าจอเป็นกิจกรรม!

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

อัพเดทมีนาคม 2557:

ณ จุดนี้คำถามควรมีตัวเลือก Fragments ด้วย ฉันคิดว่า Views น่าจะเป็นตัวเลือกที่มีโอกาสน้อยที่สุดใน 3: กิจกรรม, ส่วน, มุมมอง หากคุณต้องการใช้งานหน้าจอที่ใช้ประโยชน์จากปุ่มย้อนกลับก็ควรเป็น Activties หรือ Fragments เพราะทั้งคู่จัดการปุ่มย้อนกลับโดยกำเนิด จะต้องเพิ่มชิ้นส่วนในกองหลัง FragmentManager เพื่อให้ปุ่มย้อนกลับทำงานได้ การจัดการชิ้นส่วนกล่องโต้ตอบและกองหลังอาจเป็นเรื่องที่น่ารำคาญเล็กน้อย!

อัพเดทกันยายน 2018:

devs บางที่ Google จะแนะนำแอพพลิเคกิจกรรมเดียวโดยใช้องค์ประกอบสถาปัตยกรรมนำทางใหม่


ขอบคุณสำหรับการเพิ่ม UPDATE เพื่อพูดคุยเกี่ยวกับ Fragments ยอมรับโดยสิ้นเชิงว่าทางเลือกที่สำคัญในวันนี้คือเวลาที่จะใช้ Fragment vs Activity
ToolmakerSteve

11

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


4

แตกต่างจากที่อื่นฉันใช้ส่วนผสมของทั้งสองอย่างเช่น
1. มีเมนูหลักเมื่อแอปพลิเคชันเริ่มทำงาน
2. คุณคลิกที่ค้นหานำคุณไปยังกิจกรรมการค้นหา
3. จากนั้นมีปุ่มตัวกรองซึ่งเพียงแค่สลับมุมมองและแสดง คุณกรองตัวเลือก
4. มีสองปุ่มที่ส่วนท้ายของมุมมองตัวกรองคุณกด "ค้นหา" หรือ "ยกเลิก" และคุณจะกลับไปที่มุมมองการค้นหาอีกครั้ง (โดยไม่ต้องสลับกิจกรรม)
5. ตอนนี้หากผู้ใช้กดโทรศัพท์กลับ เขาถูกนำกลับไปที่เมนูหลักแทนที่จะเป็นตัวเลือกตัวกรองการค้นหา ซึ่งฉันเดาว่าเป็นพฤติกรรมที่ถูกต้อง.

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


3

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

แค่ความคิดเห็นของฉัน


1

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


3
StackOverflowError จะเกิดขึ้นเฉพาะใน Java เท่านั้นหากคุณมีการเรียกซ้ำแบบไม่ จำกัด บางทีคุณอาจกำลังคิดถึง OutOfMemoryError? ในฐานะโปรแกรมเมอร์ Java คุณไม่ควรกังวลว่าตัวเก็บขยะจะถูกกระตุ้นเมื่อใดหรือที่ใด
satur9nine

2
ใน android stackoverflow เกิดขึ้นเมื่อลำดับชั้นของมุมมองลึกเกินไปเช่นกัน
Danail

0

ฉันประสบปัญหามากมายเกี่ยวกับรูปแบบกิจกรรมที่หลากหลายซึ่งฉันไม่แนะนำอย่างยิ่งเว้นแต่จะมีเหตุผลที่ดีที่จะเลือก

ข้อเสียของกิจกรรมหลายอย่าง

การใช้หลายกิจกรรมเป็นการยากมากที่จะ refactor code เพื่อส่งคืนข้อมูลจากกิจกรรม

หากคุณเรียกกิจกรรมย่อยกิจกรรมหลักอาจถูกฆ่า แต่คุณไม่เคยพบว่าในขณะที่การดีบักบนอุปกรณ์ที่เหมาะสมดังนั้นคุณต้องจัดการสถานะการบันทึกและสถานะการกู้คืนอย่างถูกต้องเสมอ นั่นคือความเจ็บปวด ลองนึกภาพการเรียกใช้เมธอดบนไลบรารี (เช่นกิจกรรมอื่น) และคุณจะต้องมั่นใจว่าเมื่อวิธีการนั้นส่งคืนแอปของคุณจะต้องสามารถสร้างสถานะใหม่ได้อย่างสมบูรณ์พร้อมกับฟิลด์ทั้งหมดบนวัตถุทั้งหมดใน VM (เช่นกิจกรรม restoreIntance) มันบ้า

ในทางกลับกันเมื่อคุณเปิด subactivity VM อาจถูกฆ่าเนื่องจากมีการสร้าง subactivity เป็นครั้งแรกเช่นเมื่อแอปถูกย่อเล็กสุดในขณะที่แสดง subactivity

มันสะอาดกว่ามากที่มีเพียงที่เดียวในการจัดเก็บสถานะแอปที่เกี่ยวข้องและในกรณีของฉันส่วนใหญ่แล้วถ้า VM ถูกฆ่าฉันต้องการให้ผู้ใช้กลับไปที่หน้าจอหลักและปล่อยให้พวกเขาทำสิ่งต่างๆอีกครั้งเพราะฉันไม่ ไม่ใช้เวลา 30-50 ชั่วโมงในการเขียนโค้ดบันทึก / กลับมาใช้งานฟังก์ชันที่ 0.1% ของผู้ใช้จะเคยสัมผัส

ทางเลือก

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

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

อาจเกี่ยวข้อง: Reddit: เป็นทางการ: Google แนะนำสถาปัตยกรรมแอปกิจกรรมเดียวอย่างเป็นทางการ

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