19 ตุลาคม 2556

[Android Dev Tips] คำสั่งใน API เวอร์ชันใหม่ บนแอปพลิเคชันที่รองรับ API เวอร์ชันเก่า?


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

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

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


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

        ดังนั้นจะแก้ปัญหาดังกล่าวยังไงกันดีล่ะ? สมมติว่าเรียกใช้คำสั่งที่มีใน API 14 ขึ้นไป ก็กำหนดให้แอปพลิเคชันนี้รองรับกับเครื่อง ที่เป็น Android 4.0 (API 14) เป็นขั้นต่ำสุดดีมั้ย?

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

        ดังนั้นการกำหนดเวอร์ชันขั้นต่ำที่จะดาวน์โหลดได้ จึงไม่ได้เป็นทางออกในการแก้ปัญหานี้เสมอไป

        อีกวิธีก็คือ ทำโค๊ดให้ตรวจสอบเวอร์ชันของเครื่องก่อนใช้คำสั่ง ถ้าเครื่องเป็น API เวอร์ชันใหม่ก็ให้ใช้คำสั่งนั้นได้ แต่ถ้าเป็นเวอร์ชันต่ำกว่าก็ใช้คำสั่งอื่นทดแทนไป หรือถ้าไม่มีคำสั่งอื่นทดแทน ก็ให้แจ้งบนหน้าจอไปก็ได้ว่าการทำงานนี้ไม่รองรับในเวอร์ชันเก่า เป็นต้น
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { // คำสั่งสำหรับรองรับ API 17 ขึ้นไป } else if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { // คำสั่งสำหรับรองรับ API 11 ขึ้นไป } else { // คำสั่งสำหรับรองรับ API ต่ำกว่า 11 ลงไป }

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

        แต่ทีนี้เวลาพิมโค๊ดดังกล่าวจะมีเออเรอร์ขึ้นแจ้งในโปรแกรมดังนี้


        จากตัวอย่างโปรแกรมจะบอกว่าคำสั่งนี้รองรับ API 17 ขึ้นไป แต่โปรเจคที่สร้างขึ้นมากำหนดให้รองรับขั้นต่ำเป็น API 8 จึงอาจจะเกิดเออเรอร์กรณี No such method exception ได้ แต่ก็ไม่ต้องซีเรียสอะไร เพราะเจ้าของบล็อกใช้ IF เช็คเวอร์ชันไว้ ดังนั้นคำสั่งนี้จึงไม่มีทางทำงานในเวอร์ชันที่ต่ำกว่าได้ ส่วนวิธีแก้เออเรอร์ตรงจุดนี้ เลือกอันไหนก็ได้ ยกเว้น Explain Issue กับ Clear All Lint Markers 4 ตัวเลือกบนเป็นการประกาศคำสั่งไว้ว่าให้ละเว้นเออเรอร์นี้ ส่วน 3 ตัวเลือกที่เป็นเครื่องหมายตกใจสีเหลืองๆเป็นการยกเลิกการเช็คเออเรอร์แบบนี้ ก็จะแก้ปัญหาคำสั่งที่ไม่รองรับกับ API เวอร์ชันเก่าๆแล้ว

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




เหล่าพันธมิตรแอนดรอยด์

Devahoy Layer Net NuuNeoI The Cheese Factory Somkiat CC Mart Routine Artit-K Arnondora Kamonway Try to be android developer Oatrice Benz Nest Studios Kotchaphan@Medium Jirawatee@Medium Travispea@Medium