Android Single-Activity Architecture แค่ Activity เดียวก็พอแล้ว?

Boonya Kitpitak
Black Lens
Published in
3 min readJun 17, 2019

Activity เป็นสิ่ง Android developer ทุกคนคุ้นเคยกันเป็นอย่างดี และ Activity ก็อาจเป็นสิ่งแรกที่เราได้เรียนรู้ ในการศึกษาการพัฒนา Application Android เลยด้วยซ้ำ และใน Application ที่เราพัฒนากัน จะมี Activity มากหรือน้อยก็ขึ้นอยู่กับความซับซ้อนและ Design

ใน Google I/O 2018 พร้อมๆกับการประกาศตัวของ Jetpack ก็ได้มีการกล่าวถึงเรื่องของ Single Activity Architecture ขึ้นมา โดยจากเนื้อหาแล้วก็เหมือนว่า Google เชียร์ให้ใช้ Architecture นี้ด้วย

Today we are introducing the Navigation component as a framework for structuring your in-app UI, with a focus on making a single-Activity app the preferred architecture.

(https://android-developers.googleblog.com/2018/05/use-android-jetpack-to-accelerate-your.html?m=1)

โดยย่อแล้ว Single-Activity Architecture คือ Architecture ที่ใน Application จะมีเพียง Activity เดียว โดยแทนที่เราจะใช้ หนึ่ง Activity ต่อหนึ่ง Screen เราจะ มี Activity เป็นเหมือน Container ใหญ่ๆเพียงแค่ตัวเดียว และ Screen ต่างๆใน Application ก็จะเป็น Fragment แทน

แล้วทำไมเราถึงควรใช้ Single Activity Architecture ล่ะ การใช้ Activity หลายๆตัวในแบบที่เราเคยทำมามีปัญหาอะไร?

  1. เคยไหมกับการต้องเขียน Activity ที่มีเพียง Fragment เดียว โดยทำไปเพราะเค้าบอกกันว่าเป็น Best Practice?

(อันนี้ความเห็นส่วนตัวผมนะครับ ไม่ได้จะบอกว่าถูกหรือผิด 😀)

จริงอยู่ที่การใช้ Fragment ใน Activity เป็น Best Practice และ ทำให้เราสามารถ Reuse Fragment นั้นใน Activity อื่นได้ แต่ถ้าเราพูดถึง UI ที่ใช้เพียงที่เดียวโดยไม่มีการ Reuse ที่อื่นเลย การสร้าง Activity โดยมี Fragment ข้างในเพียงหนึ่งตัวนี่ยังจำเป็นอยู่รึเปล่า? หรือเราควรสร้าง Activity เปล่าแบบที่ไม่มี Fragment ไปเลยจะดีกว่า

แต่ถ้าเราใช้ Single Activity Architecture ก็ไม่ต้องมานั่งสร้าง Activity มาครอบ Fragment ไม่ว่าจะเพียง Fragment เดียวหรือหลาย Fragment อีกต่อไป เพราะ Application ของเราจะมีเพียง Activity เดียว

2. ปัญหาของ Transition Animation ระหว่าง Activity

สังเกตุตรง Status Bar ขณะที่มีการ Transition ระหว่าง Activity มันจะกระพิบ

ซึ่งการแก้ไขปัญหานี้ก็ไม่ตรงไปตรงมาซะทีเดียว ต้องเพิ่ม Code ที่ต้องพูดว่า ไม่บอกก็ไม่รู้นะเนี่ย เข้าไปหลายบรรทัดอยู่เหมือนกัน สามารถอ่านวิธีแก้ไข Status Bar กระพิบตอนใช้ Shared Element Transition ได้ที่นี่ https://mikescamell.com/shared-element-transitions-part-5/

แต่ปัญหานี้จะไม่เกิดขึ้นใน Transition ระหว่าง Fragment

3. การแชร์ข้อมูลกันระหว่าง Activity

เวลาที่เราจะแชร์ข้อมูลระหว่าง Activity โดยส่วนใหญ่แล้วเราก็จะเอาข้อมูลนั้นไปใส่ใน Singleton Data Holder เช่น Application Class แต่ปัญหามันอยู่ที่ว่า Singleton Data Holder นี้เนี่ยมันอยู่ในระดับ Application Scope ซึ่งเป็น Scope ที่ Service หรือ Content Provider สามารถเข้าถึงได้เช่นกัน แต่เราต้องการแชร์ข้อมูลระหว่าง Activity ไม่ได้ต้องการแชร์ กับ Service หรือ Content Provider ซักหน่อย

ถ้าอย่างนั้น Single Activity Architecture สามารถช่วยเราได้อย่างไรล่ะ? ลองดูรูปต่อไปนี้ครับ

เมื่อเราใช้ Single Activity Architecture การแชร์ข้อมูลกันก็จะเกิดขึ้นในระดับ Fragment แทนและการแชร์ข้อมูลทั้งหมดก็จะถูกครอบด้วย Activity ซึ่ง ทำให้ข้อมูลนั้นถูก Scope แยกออกจาก Application Scope และไม่สามารถเข้าถึงได้จาก Service หรือ Content Provider นั่นเอง

ถ้าอย่างนั้นเราจะเริ่มเขียน Single Activity Architecture กันยังไงดีล่ะ?

การเขียน Application ในรูปแบบ Single Activity Architecture นั้นไม่ได้ยากอย่างที่คิดเพียงเราใช้ Jetpack’s Navigation Component

เนื่องจากบทความเรี่อง Jetpack’s Navigation Component น่าจะมีเนื้อหาค่อนข้างเยอะจึงขออนุญาติแยกไว้เป็น อีกบทความหนึ่ง(ซึ่งตอนนี้กำลังปั่นอยู่ 😅)

รบกวนกดติดตาม

และ Like Page “โค้ดไม่คิด” ตามลิงค์ด้านล่างได้เลยครับ เพื่อรอรับข่าวสารได้เลยครับ 😀

https://www.facebook.com/codewithoutbrain/

💁‍♂️ อยากเพิ่ม Productivity ในการทำงานรึเปล่า?
ลองใช้แอป Ergo Pomodoro ที่พัฒนาโดย page ของกันกันเถอะ แอปนี้ใช้การจับเวลาแบบ Pomodoro เพื่อเพิ่มประสิทธิภาพการทำงานให้ดียิ่งขึ้น ใช้งานฟรี!ดาวน์โหลดกันได้เลย

✅ Android: bit.ly/3pZOuEE
✅ iOS: https://apps.apple.com/us/app/ergonomic-pomodoro-timer/id1550788893

--

--

Boonya Kitpitak
Black Lens

Android Developer at Oozou. Also Guitarist and Headbanger