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 ไม่ได้ติดตามการเปลี่ยนแปลงในเครื่องทั้งหมด คุณสามารถคลิก "ละเว้น" หรือ "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: ตรวจสอบไลบรารี Play Services ที่จําเป็นสําหรับการจดจํากิจกรรมในไฟล์ 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: เพิ่มสิทธิ์ทั้ง 2 รายการในการจดจํากิจกรรมลงในไฟล์ 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) ขึ้นไปหรือไม่ หากใช่ เราจะตรวจสอบสิทธิ์การจดจำกิจกรรม - หากผู้ใช้ไม่ให้สิทธิ์ เราจะส่งผู้ใช้ไปยังหน้าจอแนะนำ (
PermissionRationalActivity.java
) เพื่ออธิบายว่าเหตุใดแอปจึงต้องการสิทธิ์ดังกล่าวและอนุญาตให้ผู้ใช้อนุมัติ
ตรวจสอบโค้ดที่ตรวจสอบเวอร์ชัน Android
ในโมดูล base
ให้ค้นหา TODO: ตรวจสอบอุปกรณ์ที่ใช้ 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: ตรวจสอบสิทธิ์การตรวจสอบสำหรับ 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: เปิด/ปิดการติดตามกิจกรรมและขอสิทธิ์หากจําเป็นใน 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);
}
ในส่วนนี้เราจะถามว่าการจดจํากิจกรรมได้รับอนุมัติหรือไม่ หากเปิดอยู่และเปิดใช้การจดจํากิจกรรมอยู่แล้ว เราจะปิดใช้การจดจํากิจกรรม มิเช่นนั้น เราจะเปิดใช้
ในกรณีที่สิทธิ์ไม่ได้รับอนุมัติ เราจะส่งผู้ใช้ไปยังกิจกรรมหน้าจอแนะนำที่อธิบายเหตุผลที่เราต้องขอสิทธิ์ดังกล่าวและอนุญาตให้ผู้ใช้เปิดใช้สิทธิ์
ตรวจสอบรหัสคำขอสิทธิ์
ในข้อบังคับ base
ให้ค้นหา TODO: ตรวจสอบคำขอสิทธิ์สำหรับการจดจำกิจกรรมใน 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: สร้าง BroadcastReceiver เพื่อฟังการเปลี่ยนกิจกรรมใน 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 ที่แอปของคุณได้รับการแจ้งเตือน ดูข้อมูลเพิ่มเติมได้ที่การใช้ Intent ที่รอดำเนินการ
สร้างรายการ ActivitiyTransitions ที่จะติดตาม
หากต้องการสร้างออบเจ็กต์ 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: เริ่มต้น PendingIntent ที่จะทริกเกอร์เมื่อมีการเปลี่ยนกิจกรรมใน 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 ได้โดยส่งรายการ ActivityTransitions ไปยังคลาส 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: ปิดใช้การเปลี่ยนกิจกรรมเมื่อผู้ใช้ออกจากแอป ใน 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: ดึงข้อมูลการเปลี่ยนกิจกรรมจากผู้ฟังใน 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. ตรวจสอบโค้ด
คุณได้สร้างแอปง่ายๆ ที่ติดตามการเปลี่ยนกิจกรรมและแสดงรายการเหล่านั้นบนหน้าจอ
คุณสามารถอ่านโค้ดทั้งหมดเพื่อดูสิ่งที่ทําไปและทําความเข้าใจการทํางานร่วมกันได้ดียิ่งขึ้น