1. ข้อมูลเบื้องต้น
เราพกโทรศัพท์ติดตัวไปทุกที่ แต่จนถึงตอนนี้ แอปต่างๆ ก็ยังปรับประสบการณ์การใช้งานให้เข้ากับสภาพแวดล้อมและกิจกรรมของผู้ใช้ที่เปลี่ยนแปลงไปอย่างต่อเนื่องได้ยาก
ในอดีต นักพัฒนาแอปต้องใช้เวลาอันมีค่าของวิศวกรในการรวมสัญญาณต่างๆ (ตำแหน่ง เซ็นเซอร์ ฯลฯ) เพื่อพิจารณาว่ากิจกรรมต่างๆ เช่น การเดินหรือการขับรถ เริ่มต้นหรือสิ้นสุดเมื่อใด ที่แย่กว่านั้นคือเมื่อแอปตรวจสอบการเปลี่ยนแปลงในกิจกรรมของผู้ใช้อย่างต่อเนื่องและเป็นอิสระจากกัน ระยะเวลาการใช้งานแบตเตอรี่จะลดลง
Activity Recognition Transition API ช่วยแก้ปัญหาเหล่านี้ด้วยการจัดหา API ที่ใช้งานง่ายซึ่งจะประมวลผลทั้งหมดให้คุณ และเพียงแค่บอกสิ่งที่คุณสนใจจริงๆ นั่นคือ เมื่อกิจกรรมของผู้ใช้เปลี่ยนแปลง แอปของคุณเพียงแค่สมัครรับข้อมูลการเปลี่ยนผ่านในกิจกรรมที่คุณสนใจ และ API จะแจ้งให้คุณทราบถึงการเปลี่ยนแปลง
ตัวอย่างเช่น แอปรับส่งข้อความอาจถามว่า "บอกฉันเมื่อผู้ใช้ขึ้นหรือลงจากยานพาหนะ" เพื่อตั้งค่าสถานะของผู้ใช้เป็นไม่ว่าง ในทำนองเดียวกัน แอปตรวจหาที่จอดรถสามารถถามว่า "บอกฉันเมื่อผู้ใช้ลงจากรถและเริ่มเดิน" เพื่อบันทึกตำแหน่งที่จอดรถของผู้ใช้
ในโค้ดแล็บนี้ คุณจะได้เรียนรู้วิธีใช้ Activity Recognition Transition API เพื่อพิจารณาเวลาที่ผู้ใช้เริ่ม/หยุดกิจกรรม เช่น การเดินหรือการวิ่ง
สิ่งที่ต้องมีก่อน
คุ้นเคยกับการพัฒนา Android และคุ้นเคยกับการเรียกกลับ
สิ่งที่คุณจะได้เรียนรู้
- ลงทะเบียนเพื่อเปลี่ยนกิจกรรม
- การประมวลผลเหตุการณ์เหล่านั้น
- ยกเลิกการลงทะเบียนเพื่อการเปลี่ยนกิจกรรมเมื่อไม่จำเป็นต้องใช้แล้ว
สิ่งที่คุณต้องมี
- Android Studio Bumblebee
- อุปกรณ์หรือโปรแกรมจำลอง Android
2. เริ่มต้นใช้งาน
โคลนที่เก็บโปรเจ็กต์เริ่มต้น
เราได้เตรียมโปรเจ็กต์เริ่มต้นไว้ให้คุณต่อยอด เพื่อให้คุณเริ่มต้นใช้งานได้เร็วที่สุด หากติดตั้ง Git ไว้แล้ว คุณก็เรียกใช้คำสั่งด้านล่างได้เลย (คุณตรวจสอบได้โดยพิมพ์ git --version ในเทอร์มินัล / บรรทัดคำสั่ง แล้วยืนยันว่าทำงานได้อย่างถูกต้อง)
git clone https://github.com/android/codelab-activity_transitionapi
หากไม่มี Git คุณสามารถรับโปรเจ็กต์เป็นไฟล์ ZIP ได้โดยทำดังนี้
นำเข้าโปรเจ็กต์
เริ่ม Android Studio แล้วเลือก "เปิดโปรเจ็กต์ Android Studio ที่มีอยู่" จากหน้าจอต้อนรับ แล้วเปิดไดเรกทอรีโปรเจ็กต์
หลังจากโหลดโปรเจ็กต์แล้ว คุณอาจเห็นการแจ้งเตือนว่า Git ไม่ได้ติดตามการเปลี่ยนแปลงในเครื่องทั้งหมด คุณสามารถคลิก "Ignore" หรือ "X" ที่ด้านขวาบน (คุณจะไม่พุชการเปลี่ยนแปลงกลับไปยังที่เก็บ Git)
ที่มุมซ้ายบนของหน้าต่างโปรเจ็กต์ คุณควรเห็นสิ่งที่คล้ายกับรูปภาพด้านล่างหากอยู่ในมุมมอง Android (หากอยู่ในมุมมองโปรเจ็กต์ คุณจะต้องขยายโปรเจ็กต์เพื่อดูสิ่งเดียวกัน)

มีไอคอนโฟลเดอร์ 2 แบบ (base และ complete) ซึ่งแต่ละแบบเรียกว่า "โมดูล"
โปรดทราบว่า Android Studio อาจใช้เวลาหลายวินาทีในการคอมไพล์โปรเจ็กต์ในเบื้องหลังเป็นครั้งแรก ในระหว่างนี้ คุณจะเห็นวงกลมหมุนในแถบสถานะที่ด้านล่างของ Android Studio

เราขอแนะนำให้คุณรอจนกว่ากระบวนการนี้จะเสร็จสิ้นก่อนทำการเปลี่ยนแปลงโค้ด ซึ่งจะช่วยให้ Android Studio ดึงคอมโพเนนต์ที่จำเป็นทั้งหมดได้
นอกจากนี้ หากได้รับข้อความแจ้งว่า "โหลดซ้ำเพื่อให้การเปลี่ยนแปลงภาษามีผลไหม" หรือข้อความที่คล้ายกัน ให้เลือก "ใช่"
ทำความเข้าใจโปรเจ็กต์เริ่มต้น
เอาล่ะ คุณตั้งค่าเสร็จแล้วและพร้อมที่จะเพิ่มการจดจำกิจกรรม เราจะใช้baseโมดูล ซึ่งเป็นจุดเริ่มต้นของโค้ดแล็บนี้ กล่าวคือ คุณจะเพิ่มโค้ดจากแต่ละขั้นตอนไปยัง base
คุณสามารถใช้completeเพื่อตรวจสอบงานของคุณ หรือใช้เป็นข้อมูลอ้างอิงหากพบปัญหา
ภาพรวมขององค์ประกอบหลัก
MainActivity: มีโค้ดทั้งหมดที่จำเป็นสำหรับการจดจำกิจกรรม
การตั้งค่าโปรแกรมจำลอง
หากต้องการความช่วยเหลือในการตั้งค่าโปรแกรมจำลอง Android โปรดดูบทความเรียกใช้แอป
เรียกใช้โปรเจ็กต์เริ่มต้น
มาเรียกใช้แอปกัน
- เชื่อมต่ออุปกรณ์ Android กับคอมพิวเตอร์หรือเริ่มโปรแกรมจำลอง
- ในแถบเครื่องมือ ให้เลือกการกำหนดค่า
baseจากตัวเลือกแบบเลื่อนลง แล้วคลิกปุ่มสามเหลี่ยมสีเขียว (เรียกใช้) ข้างๆ

- คุณควรเห็นแอปพลิเคชันด้านล่าง

- ตอนนี้แอปไม่ได้ทำอะไรนอกเหนือจากการพิมพ์ข้อความ ตอนนี้เราจะเพิ่มการจดจำกิจกรรม
สรุป
ในขั้นตอนนี้ คุณได้เรียนรู้เกี่ยวกับสิ่งต่อไปนี้
- การตั้งค่าทั่วไปสำหรับโค้ดแล็บ
- ข้อมูลเบื้องต้นเกี่ยวกับแอป
- วิธีทำให้แอปใช้งานได้
3. ตรวจสอบไลบรารีและเพิ่มสิทธิ์ไปยังไฟล์ Manifest
หากต้องการใช้ Transition API ในแอป คุณต้องประกาศการอ้างอิงไปยัง Google Location and Activity Recognition API และระบุสิทธิ์ com.google.android.gms.permission.ACTIVITY_RECOGNITION ในไฟล์ Manifest ของแอป
- ค้นหา TODO: Review play services library required for activity recognition ในไฟล์ build.gradle คุณไม่ต้องดำเนินการใดๆ ในขั้นตอนนี้ (ขั้นตอนที่ 1) เพียงตรวจสอบการประกาศการขึ้นต่อกันที่เรากำหนด โดยควรมีลักษณะดังนี้
// TODO: Review play services library required for activity recognition.
implementation 'com.google.android.gms:play-services-location:19.0.1'
- ในโมดูล
baseให้ค้นหา TODO: Add both activity recognition permissions to the manifest ในAndroidManifest.xmlแล้วเพิ่มโค้ดด้านล่างลงในองค์ประกอบ<manifest>
<!-- TODO: Add both activity recognition permissions to the manifest. -->
<!-- Required for 28 and below. -->
<uses-permission android:name="com.google.android.gms.permission.ACTIVITY_RECOGNITION" />
<!-- Required for 29+. -->
<uses-permission android:name="android.permission.ACTIVITY_RECOGNITION" />
ตอนนี้โค้ดควรมีลักษณะคล้ายกับโค้ดต่อไปนี้
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.myapp">
<!-- TODO: Add both activity recognition permissions to the manifest. -->
<!-- Required for 28 and below. -->
<uses-permission android:name="com.google.android.gms.permission.ACTIVITY_RECOGNITION" />
<!-- Required for 29+. -->
<uses-permission android:name="android.permission.ACTIVITY_RECOGNITION" />
...
</manifest>
ดังที่คุณเห็นจากความคิดเห็น คุณต้องเพิ่มสิทธิ์ที่ 2 สำหรับ Android 10 ซึ่งจำเป็นสำหรับสิทธิ์รันไทม์ที่เพิ่มเข้ามาใน API เวอร์ชัน 29
เท่านี้ก็เรียบร้อย ตอนนี้แอปของคุณรองรับการจดจำกิจกรรมแล้ว เพียงเพิ่มโค้ดเพื่อรับข้อมูล
เรียกใช้แอป
เรียกใช้แอปจาก Android Studio โดยควรมีลักษณะเหมือนกันทุกประการ เรายังไม่ได้เพิ่มโค้ดเพื่อติดตามการเปลี่ยนผ่าน ซึ่งจะอยู่ในส่วนถัดไป
4. การตรวจสอบ/ขอสิทธิ์รันไทม์ใน Android
แม้ว่าเราจะได้รับสิทธิ์ใน API เวอร์ชัน 28 และต่ำกว่า แต่เราก็ต้องรองรับสิทธิ์รันไทม์ใน API เวอร์ชัน 29 ขึ้นไป
- ใน
MainActivity.javaเราจะตรวจสอบว่าผู้ใช้ใช้ Android 10 (29) ขึ้นไปหรือไม่ หากใช่ เราจะตรวจสอบสิทธิ์การจดจำกิจกรรม - หากไม่ได้รับสิทธิ์ เราจะส่งผู้ใช้ไปยังหน้าจอ Splash (
PermissionRationalActivity.java) เพื่ออธิบายว่าทำไมแอปจึงต้องมีสิทธิ์ดังกล่าว และอนุญาตให้ผู้ใช้อนุมัติได้
ตรวจสอบโค้ดที่ตรวจสอบเวอร์ชัน Android
ในโมดูล base ให้ค้นหา TODO: Review check for devices with Android 10 (29+) ใน MainActivity.java คุณควรเห็นข้อมูลโค้ดนี้
โปรดทราบว่าคุณไม่จำเป็นต้องดำเนินการใดๆ ในส่วนนี้
// TODO: Review check for devices with Android 10 (29+).
private boolean runningQOrLater =
android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.Q;
ดังที่กล่าวไว้ก่อนหน้านี้ คุณต้องได้รับการอนุมัติสำหรับสิทธิ์รันไทม์ android.permission.ACTIVITY_RECOGNITION ใน Android 10 ขึ้นไป เราใช้การตรวจสอบอย่างง่ายนี้เพื่อพิจารณาว่าจำเป็นต้องตรวจสอบสิทธิ์รันไทม์หรือไม่
ตรวจสอบการตรวจสอบสิทธิ์รันไทม์สำหรับการจดจำกิจกรรมหากจำเป็น
ในโมดูล base ให้ค้นหา TODO: Review permission check for 29+ ใน MainActivity.java คุณควรเห็นข้อมูลโค้ดนี้
โปรดทราบว่าคุณไม่จำเป็นต้องดำเนินการใดๆ ในส่วนนี้
// TODO: Review permission check for 29+.
if (runningQOrLater) {
return PackageManager.PERMISSION_GRANTED == ActivityCompat.checkSelfPermission(
this,
Manifest.permission.ACTIVITY_RECOGNITION
);
} else {
return true;
}
เราใช้ตัวแปรที่สร้างไว้ในขั้นตอนก่อนหน้าเพื่อดูว่าจำเป็นต้องตรวจสอบสิทธิ์รันไทม์หรือไม่
สำหรับ Q ขึ้นไป เราจะตรวจสอบและแสดงผลลัพธ์สำหรับการให้สิทธิ์รันไทม์ ซึ่งเป็นส่วนหนึ่งของวิธีที่ใหญ่กว่าที่เรียกว่า activityRecognitionPermissionApproved() ซึ่งช่วยให้ผู้พัฒนาทราบได้ในการเรียกใช้เพียงครั้งเดียวว่าเราจำเป็นต้องขอสิทธิ์หรือไม่
ขอสิทธิ์รันไทม์และเปิด/ปิดใช้การเปลี่ยนการจดจำกิจกรรม
ในโมดูล base ให้ค้นหา TODO: Enable/Disable activity tracking and ask for permissions if needed ใน MainActivity.java เพิ่มโค้ดด้านล่างหลังความคิดเห็น
// TODO: Enable/Disable activity tracking and ask for permissions if needed.
if (activityRecognitionPermissionApproved()) {
if (activityTrackingEnabled) {
disableActivityTransitions();
} else {
enableActivityTransitions();
}
} else {
// Request permission and start activity for result. If the permission is approved, we
// want to make sure we start activity recognition tracking.
Intent startIntent = new Intent(this, PermissionRationalActivity.class);
startActivityForResult(startIntent, 0);
}
ในส่วนนี้ เราจะถามว่าคุณอนุมัติการจดจำกิจกรรมหรือไม่ หากเป็นเช่นนั้นและเปิดใช้การจดจำกิจกรรมอยู่แล้ว เราจะปิดใช้การจดจำกิจกรรม มิเช่นนั้นเราจะเปิดใช้
ในกรณีที่สิทธิ์ไม่ได้รับอนุมัติ เราจะนำผู้ใช้ไปยังกิจกรรมหน้าจอ Splash ซึ่งอธิบายเหตุผลที่เราต้องขอสิทธิ์และอนุญาตให้ผู้ใช้เปิดใช้สิทธิ์
ตรวจสอบโค้ดคำขอสิทธิ์
ในโมดูล base ให้ค้นหา TODO: Review permission request for activity recognition ใน PermissionRationalActivity.java คุณควรเห็นข้อมูลโค้ดนี้
โปรดทราบว่าคุณไม่จำเป็นต้องดำเนินการใดๆ ในส่วนนี้
// TODO: Review permission request for activity recognition.
ActivityCompat.requestPermissions(
this,
new String[]{Manifest.permission.ACTIVITY_RECOGNITION},
PERMISSION_REQUEST_ACTIVITY_RECOGNITION)
ส่วนนี้เป็นส่วนที่สำคัญที่สุดของกิจกรรมและเป็นส่วนที่ต้องตรวจสอบ โค้ดจะทริกเกอร์คำขอสิทธิ์เมื่อผู้ใช้ขอ
นอกเหนือจากนั้น คลาส PermissionRationalActivity.java จะแสดงเหตุผลที่ผู้ใช้ควรอนุมัติสิทธิ์การจดจำกิจกรรม (แนวทางปฏิบัติแนะนำ) ผู้ใช้สามารถคลิกปุ่มไม่เป็นไรหรือปุ่มดำเนินการต่อ (ซึ่งจะทริกเกอร์โค้ดด้านบน)
คุณสามารถตรวจสอบไฟล์ได้หากต้องการดูข้อมูลเพิ่มเติม
5. ลงทะเบียน/ยกเลิกการลงทะเบียนตัวรับสำหรับการเปลี่ยนกิจกรรม
ก่อนที่จะตั้งค่าโค้ดการจดจำกิจกรรม เราต้องการตรวจสอบว่ากิจกรรมของเราสามารถจัดการการดำเนินการเปลี่ยนผ่านที่ระบบแจ้งได้
สร้าง BroadcastReceiver สำหรับการเปลี่ยนผ่าน
ในโมดูล base ให้ค้นหา TODO: Create a BroadcastReceiver to listen for activity transitions ใน MainActivity.java วางข้อมูลโค้ดด้านล่าง
// TODO: Create a BroadcastReceiver to listen for activity transitions.
// The receiver listens for the PendingIntent above that is triggered by the system when an
// activity transition occurs.
mTransitionsReceiver = new TransitionsReceiver();
ลงทะเบียน BroadcastReceiver สำหรับการเปลี่ยนผ่าน
ในโมดูล base ให้ค้นหา TODO: Register a BroadcastReceiver to listen for activity transitions ใน MainActivity.java (อยู่ใน onStart()) วางข้อมูลโค้ดด้านล่าง
// TODO: Register a BroadcastReceiver to listen for activity transitions.
registerReceiver(mTransitionsReceiver, new IntentFilter(TRANSITIONS_RECEIVER_ACTION));
ตอนนี้เรามีวิธีรับข้อมูลอัปเดตเมื่อมีการเปลี่ยนผ่านกิจกรรมผ่าน PendingIntent
ยกเลิกการลงทะเบียน BroadcastReceiver
ในโมดูล base ให้ค้นหา Unregister activity transition receiver when user leaves the app ใน MainActivity.java (อยู่ใน onStop()) วางข้อมูลโค้ดด้านล่าง
// TODO: Unregister activity transition receiver when user leaves the app.
unregisterReceiver(mTransitionsReceiver);
แนวทางปฏิบัติแนะนำคือยกเลิกการลงทะเบียนตัวรับเมื่อ Activity ปิดตัวลง
6. ตั้งค่าการเปลี่ยนกิจกรรมและขออัปเดต
หากต้องการเริ่มรับข้อมูลอัปเดตการเปลี่ยนกิจกรรม คุณต้องติดตั้งใช้งานสิ่งต่อไปนี้
- ออบเจ็กต์ ActivityTransitionRequest ที่ระบุประเภทกิจกรรมและการเปลี่ยน
- การเรียกกลับ PendingIntent ที่แอปของคุณได้รับการแจ้งเตือน ดูข้อมูลเพิ่มเติมได้ที่การใช้ PendingIntent
สร้างรายการ ActivityTransitions ที่จะติดตาม
หากต้องการสร้างออบเจ็กต์ ActivityTransitionRequest คุณต้องสร้างรายการออบเจ็กต์ ActivityTransition ซึ่งแสดงถึงการเปลี่ยนผ่านที่คุณต้องการติดตาม ออบเจ็กต์ ActivityTransition มีข้อมูลต่อไปนี้
- ประเภทกิจกรรมซึ่งแสดงโดยคลาส DetectedActivity Transition API รองรับกิจกรรมต่อไปนี้
- ประเภทการเปลี่ยน ซึ่งแสดงโดยคลาส ActivityTransition ประเภทการเปลี่ยนมีดังนี้
ในโมดูล base ให้ค้นหา TODO: Add activity transitions to track ใน MainActivity.java เพิ่มโค้ดด้านล่างหลังความคิดเห็น
// TODO: Add activity transitions to track.
activityTransitionList.add(new ActivityTransition.Builder()
.setActivityType(DetectedActivity.WALKING)
.setActivityTransition(ActivityTransition.ACTIVITY_TRANSITION_ENTER)
.build());
activityTransitionList.add(new ActivityTransition.Builder()
.setActivityType(DetectedActivity.WALKING)
.setActivityTransition(ActivityTransition.ACTIVITY_TRANSITION_EXIT)
.build());
activityTransitionList.add(new ActivityTransition.Builder()
.setActivityType(DetectedActivity.STILL)
.setActivityTransition(ActivityTransition.ACTIVITY_TRANSITION_ENTER)
.build());
activityTransitionList.add(new ActivityTransition.Builder()
.setActivityType(DetectedActivity.STILL)
.setActivityTransition(ActivityTransition.ACTIVITY_TRANSITION_EXIT)
.build());
โค้ดนี้จะเพิ่มการเปลี่ยนหน้าที่เราต้องการติดตามลงในรายการที่ว่างเปล่าก่อนหน้านี้
สร้าง PendingIntent
ดังที่กล่าวไว้ก่อนหน้านี้ เราต้องมี PendingIntent หากต้องการรับการแจ้งเตือนเมื่อมีการเปลี่ยนแปลงใน ActivityTransitionRequest ดังนั้นก่อนที่จะตั้งค่า ActivityTransitionRequest เราต้องสร้าง PendingIntent
ในโมดูล base ให้ค้นหา TODO: Initialize PendingIntent that will be triggered when a activity transition occurs ใน MainActivity.java เพิ่มโค้ดด้านล่างหลังความคิดเห็น
// TODO: Initialize PendingIntent that will be triggered when a activity transition occurs.
Intent intent = new Intent(TRANSITIONS_RECEIVER_ACTION);
mActivityTransitionsPendingIntent =
PendingIntent.getBroadcast(MainActivity.this, 0, intent, 0);
ตอนนี้เรามี PendingIntent ที่จะทริกเกอร์ได้เมื่อเกิด ActivityTransition รายการใดรายการหนึ่ง
สร้าง ActivityTransitionRequest และขอข้อมูลอัปเดต
คุณสร้างออบเจ็กต์ ActivityTransitionRequest ได้โดยส่งรายการ ActivityTransition ไปยังคลาส ActivityTransitionRequest
ในโมดูล base ให้ค้นหาสร้างคำขอและรอฟังการเปลี่ยนแปลงกิจกรรมใน MainActivity.java เพิ่มโค้ดด้านล่างหลังความคิดเห็น
// TODO: Create request and listen for activity changes.
ActivityTransitionRequest request = new ActivityTransitionRequest(activityTransitionList);
// Register for Transitions Updates.
Task<Void> task =
ActivityRecognition.getClient(this)
.requestActivityTransitionUpdates(request, mActivityTransitionsPendingIntent);
task.addOnSuccessListener(
new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void result) {
activityTrackingEnabled = true;
printToScreen("Transitions Api was successfully registered.");
}
});
task.addOnFailureListener(
new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
printToScreen("Transitions Api could NOT be registered: " + e);
Log.e(TAG, "Transitions Api could NOT be registered: " + e);
}
});
มาดูโค้ดกัน ก่อนอื่น เราจะสร้าง ActivityTransitionRequest จากรายการการเปลี่ยนผ่านกิจกรรม
ActivityTransitionRequest request = new ActivityTransitionRequest(activityTransitionList);
จากนั้นลงทะเบียนเพื่อรับข้อมูลอัปเดตการเปลี่ยนกิจกรรมโดยส่งอินสแตนซ์ของ ActivityTransitionRequest และออบเจ็กต์ PendingIntent ที่เราสร้างขึ้นในขั้นตอนสุดท้ายไปยังเมธอด requestActivityTransitionUpdates() เมธอด requestActivityTransitionUpdates() จะแสดงออบเจ็กต์ Task ที่คุณสามารถตรวจสอบว่าสำเร็จหรือล้มเหลวได้ ดังที่แสดงในโค้ดบล็อกถัดไป
// Register for Transitions Updates.
Task<Void> task =
ActivityRecognition.getClient(this)
.requestActivityTransitionUpdates(request, mActivityTransitionsPendingIntent);
task.addOnSuccessListener(
new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void result) {
activityTrackingEnabled = true;
printToScreen("Transitions Api was successfully registered.");
}
});
task.addOnFailureListener(
new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
printToScreen("Transitions Api could NOT be registered: " + e);
Log.e(TAG, "Transitions Api could NOT be registered: " + e);
}
});
หลังจากลงทะเบียนรับข้อมูลอัปเดตการเปลี่ยนกิจกรรมเรียบร้อยแล้ว แอปจะได้รับการแจ้งเตือนใน PendingIntent ที่ลงทะเบียนไว้ นอกจากนี้ เรายังตั้งค่าตัวแปรที่เปิดใช้การติดตามกิจกรรมเพื่อให้เราทราบว่าจะปิดใช้/เปิดใช้หรือไม่หากผู้ใช้คลิกปุ่มอีกครั้ง
นำการอัปเดตออกเมื่อแอปปิด
เราต้องนำการอัปเดตการเปลี่ยนผ่านออกเมื่อแอปปิด
ในโมดูล base ให้ค้นหาหยุดฟังการเปลี่ยนแปลงกิจกรรมใน MainActivity.java เพิ่มโค้ดด้านล่างหลังความคิดเห็น
// TODO: Stop listening for activity changes.
ActivityRecognition.getClient(this).removeActivityTransitionUpdates(mActivityTransitionsPendingIntent)
.addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
activityTrackingEnabled = false;
printToScreen("Transitions successfully unregistered.");
}
})
.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
printToScreen("Transitions could not be unregistered: " + e);
Log.e(TAG,"Transitions could not be unregistered: " + e);
}
});
ตอนนี้เราต้องเรียกใช้เมธอดที่มีโค้ดด้านบนเมื่อแอปปิดตัวลง
ในโมดูล base ให้ค้นหา TODO: Disable activity transitions when user leaves the app ใน MainActivity.java ใน onPause() เพิ่มโค้ดด้านล่างหลังความคิดเห็น
// TODO: Disable activity transitions when user leaves the app.
if (activityTrackingEnabled) {
disableActivityTransitions();
}
เพียงเท่านี้ก็เสร็จสิ้นการติดตามการเปลี่ยนแปลงการเปลี่ยนกิจกรรม ตอนนี้เราแค่ต้องประมวลผลการอัปเดต
7. การประมวลผลเหตุการณ์
เมื่อการเปลี่ยนกิจกรรมที่ขอเกิดขึ้น แอปจะได้รับการเรียกกลับ Intent ดึงออบเจ็กต์ ActivityTransitionResult ออกจาก Intent ได้ ซึ่งมีรายการออบเจ็กต์ ActivityTransitionEvent ระบบจะจัดเรียงเหตุการณ์ตามลำดับเวลา เช่น หากแอปขอประเภทกิจกรรม IN_VEHICLE ในการเปลี่ยน ACTIVITY_TRANSITION_ENTER และ ACTIVITY_TRANSITION_EXIT แอปจะได้รับออบเจ็กต์ ActivityTransitionEvent เมื่อผู้ใช้เริ่มขับรถ และอีกออบเจ็กต์หนึ่งเมื่อผู้ใช้เปลี่ยนไปทำกิจกรรมอื่น
มาเพิ่มโค้ดเพื่อจัดการเหตุการณ์เหล่านั้นกัน
ในโมดูล base ให้ค้นหา TODO: Extract activity transition information from listener ใน MainActivity.java ใน onReceive() ของ BroadcastReceiver ที่เราสร้างไว้ก่อนหน้านี้ เพิ่มโค้ดด้านล่างหลังความคิดเห็น
// TODO: Extract activity transition information from listener.
if (ActivityTransitionResult.hasResult(intent)) {
ActivityTransitionResult result = ActivityTransitionResult.extractResult(intent);
for (ActivityTransitionEvent event : result.getTransitionEvents()) {
String info = "Transition: " + toActivityString(event.getActivityType()) +
" (" + toTransitionType(event.getTransitionType()) + ")" + " " +
new SimpleDateFormat("HH:mm:ss", Locale.US).format(new Date());
printToScreen(info);
}
}
ซึ่งจะแปลงข้อมูลเป็น String และพิมพ์ลงในหน้าจอ
เท่านี้ก็เสร็จเรียบร้อย ลองเรียกใช้แอป
หมายเหตุสำคัญ: การจำลองการเปลี่ยนแปลงกิจกรรมในโปรแกรมจำลองทำได้ยาก ดังนั้นเราจึงแนะนำให้ใช้อุปกรณ์จริง
คุณควรติดตามการเปลี่ยนแปลงกิจกรรมได้
โปรดติดตั้งแอปในอุปกรณ์จริงและเดินไปรอบๆ เพื่อให้ได้ผลลัพธ์ที่ดีที่สุด :)
8. ตรวจสอบโค้ด
คุณสร้างแอปง่ายๆ ที่ติดตามการเปลี่ยนผ่านกิจกรรมและแสดงรายการเหล่านั้นบนหน้าจอ
คุณสามารถอ่านโค้ดทั้งหมดเพื่อตรวจสอบสิ่งที่คุณทำและทำความเข้าใจวิธีที่โค้ดทำงานร่วมกันได้ดียิ่งขึ้น