web analytics

[Android Code] การสร้าง Android Slices ตอนที่ 1

cover-1

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

 

รู้จักกับ slice

Slice คือ การแสดงส่วนนึงของแอปในแอปอื่น หรือก็คือเราสามารถนำอะไรบางอย่างในแอปอื่นที่เขาเตรียมไว้มาไว้ในแอปเราได้ แบบเดียวกับที่เห็นใน Google Assistance ซึ่งความสามารถนี้มากับ Android P แต่สามารถใช้งานได้ย้อนไปตั้งแต่ Android Kitkat 4.4 เลยนะ

 

เริ่มต้น

โดยบทความนี้ ผมจะลองเล่นเจ้า Slice โดยการทำแอปตัวแรกที่เตรียม Slice เอาไว้ 1 อัน จากนั้นทำแอปตัวที่สอง โดยจะนำเอา Slice ของแอปแรกมาแสดง โดยแอปตัวที่สองจะไม่มีอะไรเลย นอกจาก Slice Viewer
เริ่มกันเลย

 

เพิ่ม Dependencies

ตัว Slice library จะอยู่ใน androidx ซึ่งก็คือ ทาง Google ได้รวมพวก Support library ต่างๆไว้ที่เดียว

 

หรือถ้าไม่ใช้ androidx จะใช้แบบ support แบบเดิมปกติก็ได้

 

สร้าง Provider

สร้าง class ขึ้นมาแล้ว extends SliceProvider ซึ่ง class นี้จะทำงานตอนที่ slice ของเราถูกเรียกใช้งาน
method ที่สำคัญคือ onBindSlice(Uri) เดี๋ยวเราค่อยมาเขียนส่วนนี้ทีหลัง

 

สร้าง BroadcastReceiver

สร้าง class BroadcastReceiver ซึ่งคลาสนี้จะทำงานตอนมี action มา slice ของเรา เช่น กดปุ่ม
ตอนนี้ให้กำหนด KEY ของ ACTION ที่เราจะรับเข้ามาว่ามีอะไรบ้าง แล้วเดี๋ยวเราค่อยมาเขียนส่วนนี้ทีหลัง

 

กำหนด Provider และ Receiver ใน manifests

กำหนด provider ของเราลงใน Androidmanifests.xml เพื่อให้แอปรู้จักกับ provider ของเรา

 

เขียนส่วน Slice Provider

ต่อมาก็มากำหนดว่า Slice ของเราจะมีอะไรแสดงบ้าง
โดยเราจะเริ่มออกแบบ Slice ง่ายๆแบบนี้ก่อน

1

 

เริ่มจาก Slice ของแอปนั้นจะใช้ URI ในการระบุตัวตนของ slice ซึ่งก็คือ content://<packagename>/<PATH SOMETHING> เช่น

ดังนั้น ถ้ามีแอปไหนเรียกใช้ slice ของเรา จะมาเข้าที่ onBindSlice(uri) ให้เช็ค URI ที่ได้รับเข้ามา
หากตรงกับของเรา ก็ให้สร้าง slice แล้ว return ค่ากลับไป

 

ต่อมาก็มาเขียนส่วนของการสร้าง slice
วิธีการคือใช้คลาสที่ชื่อว่า ListBuider จะสร้าง view ใน slice แบบลิส ดังนั้นให้เราสร้างแถว เพิ่ม action
ที่สำคัญต้องใส่ setPrimaryAction(action) เสมอ ซึ่งก็คือเมื่อผู้ใช้กดทีื่ slice ของเรา

 

แล้วก็ในที่นี้จะต้องมีที่เก็บค่า ของ volume จึงขอสมมุติโดยการสร้าง class ตัวแปรแบบ static ไว้

 

ส่วน SliceAction จะกำหนดไว้ 3 อย่าง คือปุ่ม เพิ่ม-ลดด้านขวา กดแล้วตัวเลขจะเพิ่มขึ้น-ลดลง แล้วก็เมื่อกดที่ตัว slice จะให้ทำการเปิดแอปของเราขึ้นมา
ซึ่ง SliceAction จะต้องกำหนด PendingIntent เสมอ ซึ่งมันก็การการกำหนดว่าให้ action นั้นๆทำอะไร และ PendingIntent ก็จะกำหนด Action เป็น KEY ใน receiver ของเรา
แล้วก็ reqCode ของ PendingIntent ของ action เพิ่ม กับ action ลด ห้ามซ้ำกันนะ

 

เขียนส่วน Slice Receiver

ต่อมาเขียน onReceive() ให้เช็ค Action ของ Intent
แล้วก็ update ค่า volume ใหม่ จากนั้นก็ให้ update Slice ใหม่อีกครั้ง ใช้คำสั่ง notifyChange(uri)

 

สร้างแอปที่สองสำหรับแสดง Slice

ให้สร้างโปรเจคอีกตัว โดยแอปนี้จะเอาไว้แสดง slice ของแอปแรก
โดยกำหนด packagename ต่างจากแอปแรก

 

เพิ่ม Dependencies

เพิ่ม dependencies ของ slice-view

 

กำหนด SliceView ใน layout

ที่ layout ของ activity หรือ fragment ให้กำหนด SliceView ลงไป

 

ใช้งาน SliceView ใน Activity

ในที่นี้ผมจะใช้ sliceView ใน MainActivity
วิธีการใช้ คือใช้คลาสที่ชื่อว่า LiveData โดยแปลงมาจาก URI ในที่นี้คือ URI ของแอปตัวแรกที่เราทำไว้
แล้วก็เรียก observe

 

อธิบายเพิ่มเติมอีกนิด ซึ่งพารามิเตอร์ตัวแรกของ observe คือ LifecycleOwner มันคือ คลาสที่รวมพวก lifecycle ของ activity , fragment เช่น onStart() , onStop() , onResume() เอาไว้ ดังนั้นเราก็แค่โยน activity ให้มัน แล้วที่เหลือเดี๋ยวมันจัดการเอง

 

ลองรัน

ความสามารถนี้สามารถใช้งานย้อนไปถึง Android 4.4 เลย
รันแอปที่สอง (Slice view) ดูผลลัพธ์ แอปจะถามหา permission

screenshot_1534751742

ก็ให้เรากด อนุญาตซะ

screenshot_1534751746

 

screenshot_1534755304

 

เราจะสามารถมี action กับ slice ได้

g1

 

บทความนี้ขอหยุดเพียงเท่านี้ก่อน บทความนี้รวมๆก็คือเป็นการนำ slice ไปใช้ ในตอนหน้าจะลองทำ Slice แบบ advance ขึ้น

 

ตัวอย่างโปรเจค

https://github.com/benznest/my-android-slices/tree/master

 

Reference

https://developer.android.com/guide/slices/
https://codelabs.developers.google.com/codelabs/android-slices-basic/index.html