21 November 2013

[Android Dev Tips] มีอะไรบ้างใน Android 4.4 KitKat [แบบฉบับนักพัฒนา]



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

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

        สำหรับ Android 4.4 หรือที่เรียกกันว่า KitKat ซึ่งล่าสุดได้ปล่อยออกมาให้อัพเดทกันแล้วในกลุ่มผู้ใช้อุปกรณ์แอนดรอยด์ตระกูล Nexus โดยเวอร์ชันนี้จะมี API Level เป็น 19 ถ้าอยากให้แอปพลิเคชัน สามารถ Optimized ได้ดีที่สุดก็ควรกำหนด Target SDK เป็น 19


มีอะไรที่เปลี่ยนไปจากเก่าบ้าง?

การเข้าถึง Storage

        ในการเข้าถึง Storage ที่ใช้คำสั่ง getExternalStoragePublicDirectory() จะต้องประกาศ Permission ด้วย ขึ้นอยู่กับว่าจะใช้งาน Read หรือ Write  ถ้าใช้งาน Read ก็ประกาศว่า READ_EXTERNAL_STORAGE  และถ้าใช้งาน Write ก็ประกาศว่า WRITE_EXTERNAL_STORAGE ในกรณีที่ใช้งาน Storage ในส่วนที่เป็นพื้นที่ของแอปพลิเคชันนั้นๆ ไม่ต้องประกาศ Permission โดยใช้คำสั่ง getExternalFilesDir()

WebView

        โค๊ดที่เกี่ยวข้องกับคลาสของ Web View ทั้งหมดจะถูกปรับปรุงใหม่ โดยผนวกชุดคำสั่งจาก Chromium เข้ามาด้วย เพื่อให้สามารถทำงานและแสดงผลได้อย่างถูกต้องมากขึ้น รองรับคุณสมบัติใหม่ๆของ HTML5, CCS3 และ JavaScript รองรับการใช้งาน Remote Debugging  สำหรับข้อมูลในเรื่อง Web View บน 4.4 ดูเพิ่มเติมได้ที่ Migrating to WebView in Android 4.4

AlarmManager และ SyncAdapter


        เจ้าของบล็อกไม่เคยใช้ ไม่รู้จะอธิบายยังไง รู้แค่ว่ามีการเปลี่ยนแปลง ผู้ที่หลงเข้ามาอ่านที่ใช้คลาสทั้งสองให้ไปศึกษาดู โดยเฉพาะ AlarmManager ที่เดิมสามารถ Repeat ได้ แต่บน 4.4 จะไม่แน่นอนอีกต่อไป ทั้งนี้บน 4.4 มีการจัดการคลาสเหล่านี้ใหม่เพื่อลด Event ที่ไม่จำเป็นออก ดังนั้นถึงใช้ AlarmManager ให้ Repeat ตลอด ควรใส่คำสั่งให้ AlarmManager ทำ งานใหม่เรื่อยๆแทนแบบเก่า

        AlarmManager (android.app.AlarmManager)
        Transferring Data Using Sync Adapters

มีอะไรที่เพิ่มเข้ามาใหม่บ้าง?

Printing Framework

        API ที่จะเข้ามาช่วยในการทำให้แอปพลิเคชันสามารถรองรับกับเครื่องปริ้นที่สามารถใช้งานผ่าน Cloud Print, WiFi หรือ Bluetooth ไม่ว่าจะปริ้นเอกสารหรือรูปภาพก็ตาม รวมไปถึงการใช้ Service ด้วย

        Printing Content
        Printing Framwork (android.print)



SMS Provider

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

        Getting Your SMS Apps Ready for KitKat
        DevBytes: Android 4.4 SMS APIs [YouTube]


Host card emulation

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

        Host-based Card Emulation


NFC reader mode

        การอ่าน NFC เดิมทีจะต้องทำผ่าน Background ซึ่งต้องรอให้อ่านการ์ด NFC ก่อน แต่ใน 4.4 ได้เพิ่มเติมระบบ NFC reader เพื่อให้สามารถเปิดแอปพลิเคชัน แล้วทำการอ่านการ์ด NFC ได้ทันที (ทำงานบน Foreground ได้แล้ว) โดยมีคำสั่ง NfcAdapter.ReaderCallback ที่สามารถกำหนด Callback ได้ ถ้าสังเกตดีๆจะเห็นว่าการเพิ่มความสามารถในเรื่องนี้เข้ามา จะทำให้สอดคล้องกับระบบ Host card emulation ดังนั้นจึงทำให้แอนดรอยด์ตัวหนึ่งเป็นตัวอ่าน NFC และอีกตัวหนึ่งเป็นตัวจำลองการ์ด NFC นั่นเอง

Infrared transmitters


        รีโมต IR เดิมทีถูกเพิ่มเข้ามาโดยผู้ผลิตเอง อย่าง Sony, LG หรือ Samsung เพื่อให้อุปกรณ์แอนดรอยด์สามารถใช้แทนรีโมตทีวีสำหรับทีวีแต่ละยี่ห้อได้ ซึ่งบน 4.4 นี้ได้ทำการเพิ่ม IR เข้ามาเป็นเซนเซอร์ในแอนดรอยด์แล้ว จึงทำให้สามารถเขียนควบคุมรีโมต IR ได้ด้วยคลาส ConsumerIrManager แต่อย่าลืมนะว่าเครื่องต้องมี IR ด้วยล่ะ (Nexus 5 ยังไม่มีซะงั้น ฮาๆ)

        ComsumerIrManager (android.hardware.ConsumerIrManager)

Low Ram Device

        สามารถเช็คได้ว่าเครื่องนั้นๆเป็นเครื่องที่มี Ram ต่ำหรือไม่ เนื่องจาก 4.4 นั้นได้พัฒนาเพื่อให้รองรับกับ Ram ต่ำๆด้วย จึงมีคำสั่ง ActivityManager.isLowRamDevice() ที่ Return เป็น Boolean เพื่อให้นักพัฒนาตรวจสอบได้ และสามารถ Optimized ได้สะดวก เช่น การทำงานที่ใช้งาน Ram อย่างเต็มที่บนเครื่องที่ Ram เยอะ แต่จะทำงานด้วยอีกชุดคำสั่งที่ใช้งาน Ram ต่ำกว่าบนเครื่องที่ Ram ต่ำ

        Managing Your App's Memory

Adaptive playback

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

        MediaCodec (android.media.MediaCodec)

Common Encryption for DASH

        รองรับ Encrytion สำหรับไฟล์วีดีโอแบบ MPEG-DASH

On-demand audio timestamp

        สามารถรู้ได้ว่าเสียงในช่วงนั้นๆเล่นอยู่ในช่วงใดของเฟรมวีดีโอ เพื่อให้สามารถรองรับ Audio-Video Sychronization ได้สะดวกขึ้น

        AudioTimestamp (android.media.AudioTimestamp)

Surface image reader

        คลาส ImageReader ที่จะทำให้ผู้ที่หลงเข้ามาอ่านสามารถเข้าถึงบัฟเฟอร์ของภาพก่อนที่จะเรนเดอร์ลงบน Suface ได้โดยตรง

        Image Reader (android.media.ImageReader)

Peak and RMS measurement

        บน 4.4 สามารถรู้ค่า Peak ของ RMS ในแหล่งเสียงจากคลาส Visualizer ได้ โดยมีคลาส Visualizer.MeasurementPeakRms ให้เรียกใช้ เพื่อใช้รับข้อมูลจากคำสั่ง getMeasurementPeakRms() ของคลาส Visualizer

        Visualizer (android.media.audiofx.Visualizer)

Loudness enhancer

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

        LoudnessEnhancer (android.media.audiofx.LoudnessEnhancer)

Remote controllers

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

        RemoteController (android.media.RemoteController)

Closed captions

       บน 4.4 ตอนนี้คลาส VideoView รองรับ Subtitle และ Caption แล้ว และ WebVTT ด้วย ซึ่งเป็นซับไตเติลของวีดีโอที่เล่นผ่านสตรีมออนไลน์

        VideoView (android.widget.VideoView)

Scenes and transitions

        API ใหม่สำหรับการทำ Animation บนแอนดรอยด์ที่ใช้หลักการของ Scenes และ Transitions จะว่าไปก็คล้ายๆกับบน Flash ดีนะ จะให้เล่าให้ฟังก็เดี๋ยวจะงงกันใหญ่ ลองดูวีดีโอของ DevBytes เลย

        DevBytes: Android 4.4 Transitions [YouTube]

Animator pausing

        คลาส Animator ตอนนี้สามารถหยุดชั่วคราวและเล่นต่อได้แล้ว

        Animator (android.animation.Animator)

Reusable bitmaps

        การนำค่าของภาพ Bitmap ที่เคยใช้ไปแล้วกลับมาใช้ใหม่ โดยต้องเป็นภาพ Bitmap ที่เคยผ่านการ Decode มาแล้ว เวลาต้องการเรียกใช้ใหม่ก็สามารถใช้ค่าที่เคยกำหนดแล้วได้เลย

        Managing Bitmap Memory

GLES2.0 SurfaceFlinger

        อัพเดท SurfaceFlinger ที่จากเดิมเป็น Open GL 1.0 ให้เป็น 2.0

New Bluetooth profiles

        รองรับ Bluetooth HID over GATT (HOGP) เพื่อให้ทำงานได้โดยมี Latency ที่ต่ำ แต่ใช้พลังงานน้อยลง 
        Bluetooth MAP ที่จะรองรับการเชื่อมต่อเพื่อส่งข้อความ กับอุปกรณ์พกพาต่างๆที่รองรับการเชื่อมต่อผ่านบลูทูธ 
        Bluetooth AVRCP 1.3 สามารถกำหนดระดับเสียงของระบบได้แล้ว

Storage access framework

        Storage API ที่เพิ่มเข้ามาใน 4.4 ช่วยเป็นตัวกลางในการเข้าถึง Storageเวลาที่แอปพลิเคชันของผู้ที่หลงเข้ามาอ่านต้องการให้ผู้ใช้เลือกไฟล์ และยังสามารถพัฒนาแอปพลิเคชันเพื่อรองรับกับ Framework ตัวนี้ได้ด้วย

        Storage Access Framework


New sensor types

        เซนเซอร์ที่ถูกเพิ่มเข้ามาใหม่ใน 4.4 จะมีดังนี้ TYPE_GEOMAGNETIC_ROTATION_VECTOR  ทำหน้าที่เหมือน TYPE_ROTATION_VECTOR  แต่ทำงานด้วย Magnetometer แทน Gyroscope เพราะในบางเครื่องไม่มี Gyroscope นั่นเอง TYPE_STEP_DETECTOR กับ TYPE_STEP_COUNTER  ที่เอาไว้นับก้าวหรือตรวจจับว่ามีการเดินหรือไม่ ซึ่งเป็นการนับ Accelerometer มาประยุกต์เพิ่มเติม


Batched sensor events

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

Controller identities

        สามารถเชื่อมต่อกับจอยเกมได้มากกว่า 1 ตัวขึ้นไป (ทำได้มาพักนึงแล้ว) โดยสามารถรู้ถึงสถานะของจอยเกมแต่ละตัวได้ว่าเชื่อมต่ออยู่หรือไม่ มีการตั้งค่าใหม่หรือไม่ และอ่านค่า Product ID และ Vendor ID ของจอยนนั้นๆได้

        InputDevice (android.view.InputDevice)

Immersive full-screen mode

        รองรับการทำงานของแอปพลิเคชันแบบเต็มจออย่างเต็มตัวแล้ว เดิมทีการแสดงผลเต็มจอ (ซ่อน Status Bar และ Navigation Bar) จะถูกยกเลิกเมื่อผู้ใช้สัมผัสที่หน้าจอ แต่บน 4.4 เพิ่ม Immersive เข้ามา เพื่อให้ผู้ใช้งานสามารถใช้งานได้เต็มหน้าจอจริงๆ เมื่อต้องการแสดง Navigation Bar และ Status Bar ผู้ใช้ก็เพียงแค่ลากนิ้วจากขอบจอฝั่งบนหรือล่างเข้ามา โดยใช้ SYSTEM_UI_FLAG_IMMERSIVE หรือ SYSTEM_UI_FLAG_IMMERSIVE_STICKY   ที่ต้องใช้ร่วมกับ SYSTEM_UI_FLAG_HIDE_NAVIGATION  หรือ SYSTEM_UI_FLAG_FULLSCREEN ตามความต้องการ



Translucent system bars

        รองรับการทำ Translucent ให้กับ Status Bar และ Navigation Bar โดยใช้ FLAG_TRANSLUCENT_NAVIGATION และ FLAG_TRANSLUCENT_STATUS หรือกำหนดเป็น Theme ก็ได้ Theme.Holo.NoActionBar.TranslucentDecor และ  Theme.Holo.Light.NoActionBar.TranslucentDecor


Enhanced notification listener

        บน 4.3 ได้มีการเพิ่มคลาส NotificationListenerService เข้ามา เพื่อเป็น Listener สำหรับ Event ที่เกิดขึ้นบน Notification ใน 4.4 ได้ถูกเพิ่มเติมให้รับข้อมูล Extras จาก Notifcation ได้

        NotificationListenerService (android.service.notification.NotificationListenerService)

Drawable mirroring for RTL layouts

        ในเวอร์ชันเก่าๆ ถ้าต้องการให้แอปพลิเคชันแสดงภาพกลับด้านซ้ายขวาจะต้องเก็บภาพไว้ในโฟลเดอร์ drawable-ldrtl แต่ใน 4.4 เพิ่มคำสั่ง setAutoMirrored() เข้ามาในคลาส Drawable เรียบร้อยแล้ว

Accessibility

        อันนี้เจ้าของบล็อกไม่เคยใช้ เลยไม่ขอพูดถึง เพราะไม่ค่อยเข้าใจ

App Permissions

        บน 4.4 มีการเพิ่ม Permission เข้ามาอีก 3 ตัวดังนี้
        INSTALL_SHORTCUT แอปพลิเคชันติดตั้ง Shortcut ลงบน Launcher ได้
        UNINSTALL_SHORTCUT แอปพลิเคชันลบ Shortcut ออกจาก Launcher ได้
        TRANSMIT_IR แอปพลิเคชันสามารถใช้งาน IR Transmitter ได้ (เครื่องต้องรองรับ)

Device Features

        ฟีเจอร์ที่เพิ่มเข้ามาใน 4.4 มีด้วยกันดังนี้
        FEATURE_CONSUMER_IR อุปกรณ์รองรับการสื่อสารผ่านคลื่นอินฟราเรด
        FEATURE_DEVICE_ADMIN อุปกรณ์รองรับการบังคับใช้นโยบายผ่านทาง Device Admins
        FEATURE_NFC_HOST_CARD_EMULATION อุปกรณ์รองรับการจำลองเป็นการ์ด NFC
        FEATURE_SENSOR_STEP_COUNTER อุปกรณ์มีเซนเซอร์นับจำนวนก้าว
        FEATURE_SENSOR_STEP_DETECTOR อุปกรณ์มีเซนเซอร์ตรวจจับการเดิน

Screen Recorder

        การบันทึกภาพวีดีโอบนหน้าจออุปกรณ์แอนดรอยด์ โดยทำผ่าน ADB Command บันทึกได้สูงสุด 3 นาที สามารถกำหนดได้ทั้งขนาดภาพ เวลา และบิตเรต


        เท่าที่เจ้าของบล็อกไปนั่งส่องดูก็มีแค่นี้แหละ แต่ถ้าอยากรู้ว่ามีคำสั่งอะไรที่เปลี่ยนแปลงใน 4.4 ก็ดูได้ที่ Android API Differences Report [Android 4.4]




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

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