Android Lecture : Context ใน Android คืออะไร ทำไมถึงเจอบ่อยจัง
สวัสดีครับ บทความนี้เป็นบทความแรกเลยของผม เกี่ยวกับ Android ขอเริ่มจากเรื่องใหญ่ของ android ที่ไม่รู้ไม่ได้เลยอย่างเรื่องของ Context เป็นเรื่องที่คนที่เริ่มทำแอนดรอยด์แรกๆ อาจจะงง เพราะผมก็งงมาก่อนเหมือนกัน
จุดประสงค์ของบทความที่ก็เพื่อจะช่วยให้คนเข้าใจมากขึ้น และผมจะได้ทบทวนความรู้ คอนเซปไปในตัวด้วย เดี๋ยวจะเขียนอีกในหลายๆเรื่อง
Context คืออะไร
context คืออะไร มันคือตัวกลางในการติดต่อสือสารกับสิ่งต่างๆในแอปของเรา เหมือนกับคนรับใช้เลยละ อย่างเช่น เราต้องการข้อมูลเกี่ยวกับรูปภาพในโฟลเดอร์ Resource เราก็ต้องอัญเชิญ context มาเป็นตัวกลางให้ไปเอาของที่เราต้องการมาให้ ไม่ได้มีเพียงแค่ resource แต่เป็นทุกอย่างในแอปเราเลย
ดูรูปข้างล่าง กรอบสีเหลืองๆคือแอปของเรา ในแอปของเรามีสิ่งของเต็มไปหมดเลย และก็มีส่วนหนึ่งคือโค้ดโปรแกรมของเรา จะเห็นว่าการที่เราจะติดต่อกับสิ่งต่างๆได้ก็ต้องอาศัยเจ้าตัว context นี่นั่นเอง และก็มีสิ่งต่างมากมายเต็มไปหมดที่เราสามารถไปติดต่อมาได้ ดังนั้นไม่ต้องแปลกใจว่าทำไม เจอ context แทบจะทุกที่เลย
ตัวอย่างที่เรามักจะใช้กันใน Activity เช่น
getLayoutInflater()
ตัวนี้คือเรียกตัว LayoutInflater มา เอาไว้สร้าง View
หรือจะเรียกใช้ WindowsManager ที่เอาไว้จัดการหน้าจอได้ เช่นหาความกว้างจอ
getWindowManager()
เราสร้างเมนูขึ้นมาเองไม่ได้ ก็ต้องไปอัญเชิญ MenuInflater มา ช่วยสร้างเมนู
getMenuInflater()
ทำไมใน Activity เวลาเรียก ไม่เห็นใช้ Context
ทีนี้จะเห็นว่าใน Activity เราจะเรียกใช้ LayoutInflater เราสามารถใช้ getLayoutInflater() ได้เลย ข้างหน้าไม่เห็นมี context อะไร ทำไมเป็นอย่างนั้นละ ลองเข้าเว็บ android developer ดู แล้วดูที่ Activity ว่ามัน extends อะไร ก็จะพบคำตอบว่า มัน extends Context มาอีกที ดังนั้นไม่ต้องสงสัยเลย เจ้า Activity ตัวมันเองก็คือ context นั่นแหละ
ทำให้เราสามารถใช้ ตัว Activity เป็น context ได้
MainActivity.this
เวลาเราใช้ Toast.makeText() เราเลยใช้ Activity.this เป็น context ได้เลย
แต่ในกรณีอื่นๆ ที่ไม่ได้อยู่ใน Activity เช่นสร้าง Class ขึ้นมาเอง เราก็ต้องหาเจ้า Context มาให้ได้ก่อน หากอยู่ใน View ก็สามารถใช้คำสั่ง
getContext()
มาใช้ได้เลย ง่ายแสนง่าย
ประเภทของ Context
ไม่เพียงแค่นั้น หากมองในระดับที่ใหญ่ออกมา Context ไม่ได้มีแค่ระดับ Activity แต่มีระดับที่ใหญ่ออกมาที่มีได้แค่ตัวเดียวในแอปคือ Application Context สิ่งที่แตกต่างคือการใช้งาน และ life cycle ของมัน ตัว activity context จะเกิดและตายไปพร้อมกับ activity แต่ Application context จะมีชีวิตตั้งแต่รันแอปจนถึงปิดแอปเลย
Application Context คืออะไร
เราคงเคยเห็นคำสั่ง
getApplicationContext()
นี่คือการอัญเชิญ Application context ออกมา ตัวที่มีตัวเดียวในแอป โดยความสามารถของมันคือจัดการได้ในระดับแอป เช่น สมมุติเราต้องการมีคลาสที่เก็บ Context เอาไว้ และมันสามารถเรียกใช้ได้ทุก Activity แบบนี้เราต้องใช้ Application Context เพราะ หากใช้ Activity Context พอ activity นั้น ถูกทำลาย context มันจะเป็น null ทันที แต่ก็อยู่ที่การใช้งานอีกที
การใช้งาน Application Context & Activity Context
การใช้งาน Context ของทั้งสองอัน ส่วนใหญ่จะใช้งานแทนกันได้เลย เช่นการ เรียก Resource ก็สามารถใช้ได้ทั้งสองตัว หรือแม้แต่ Toast.makeText() ก็สามารถใช้ได้ทั้งสองอัน
แต่ในบางเรื่องก็ไม่สามารถทำได้ เช่น การทำ Intent ระหว่าง Activity ต้องใช้ Activity Context นะ ดังนั้นเราต้องรู้ว่า คำสั่งนั้นๆ ที่ต้องการใช้ Context ต้องการใช้ Context ประเภทไหน หากไม่รู้ก็ต้องไปเปิด Document ดูว่ามันใช้อะไร และอีกสิ่งที่ต้องพิจารณาหากเราสามารถใช้งานทั้งสองอย่างได้ ก็ต้องดู ช่วงชีวิตของมันว่าเหมาะสมกับอะไรแล้วค่อยเลือกใช้
จบแล้ว
บทความนี้เป็นบทความสั้นๆ แต่เป็นเรื่องที่สำคัญใน Android เลยละ และเราก็ต้องเจอกับเจ้า Context นี้ไปตลอดการเขียนแอนดรอยด์แน่ๆ ดังนั้นเราต้องทำความเข้าใจกับมันไว้ให้ดี รักๆกันๆ หวังว่าจะเป็นประโยชน์ต่อผู้อ่านครับ