Codelab ของ Activity Recognition Transition API

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 (หากอยู่ในมุมมองโปรเจ็กต์ คุณจะต้องขยายโปรเจ็กต์เพื่อดูข้อมูลเดียวกัน)

d2363db913d8e5ad.png

ไอคอนโฟลเดอร์มี 2 ไอคอน (base และ complete) โดยแต่ละไอคอนเรียกว่า "โมดูล"

โปรดทราบว่า Android Studio อาจใช้เวลาหลายวินาทีเพื่อคอมไพล์โปรเจ็กต์ในเบื้องหลังเป็นครั้งแรก ในระหว่างนี้ คุณจะเห็นภาพหมุนในแถบสถานะที่ด้านล่างของ Android Studio

c9f23d5336be3cfe.png

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

นอกจากนี้ หากคุณได้รับข้อความแจ้งว่า "โหลดซ้ำเพื่อให้การเปลี่ยนแปลงภาษามีผลไหม" หรือข้อความที่คล้ายกัน ให้เลือก "ใช่"

ทําความเข้าใจโปรเจ็กต์เริ่มต้น

การตั้งค่าเสร็จสมบูรณ์แล้ว คุณพร้อมที่จะเพิ่มการจดจำกิจกรรมแล้ว เราจะใช้โมดูล base ซึ่งเป็นจุดเริ่มต้นของโค้ดแล็บนี้ กล่าวคือ คุณจะเพิ่มโค้ดจากแต่ละขั้นตอนลงใน base

โมดูล complete ใช้ตรวจสอบงานหรือใช้อ้างอิงได้หากพบปัญหา

ภาพรวมขององค์ประกอบหลัก

  • MainActivity: มีโค้ดทั้งหมดที่จําเป็นสําหรับการจดจํากิจกรรม

การตั้งค่าโปรแกรมจำลอง

หากต้องการความช่วยเหลือในการตั้งค่าโปรแกรมจำลอง Android โปรดดูบทความเรียกใช้แอป

เรียกใช้โปรเจ็กต์เริ่มต้น

มาเรียกใช้แอปกัน

  • เชื่อมต่ออุปกรณ์ Android กับคอมพิวเตอร์หรือเริ่มโปรแกรมจำลอง
  • ในแถบเครื่องมือ ให้เลือกการกําหนดค่า base จากตัวเลือกแบบเลื่อนลง แล้วคลิกปุ่มสามเหลี่ยมสีเขียว (เรียกใช้) ข้างๆ

a640a291ffaf62ad.png

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

f58d4bb92ee77f41.png

  • ตอนนี้แอปไม่ทำอะไรเลยนอกจากพิมพ์ข้อความ ตอนนี้เราจะเพิ่มการจดจำกิจกรรม

สรุป

ในขั้นตอนนี้ คุณได้เรียนรู้เกี่ยวกับสิ่งต่อไปนี้

  • การตั้งค่าทั่วไปสําหรับโค้ดแล็บ
  • ข้อมูลเบื้องต้นเกี่ยวกับแอป
  • วิธีทำให้แอปใช้งานได้

3. ตรวจสอบคลังและเพิ่มสิทธิ์ในไฟล์ Manifest

หากต้องการใช้ Transition API ในแอป คุณต้องประกาศการพึ่งพา Google Location and Activity Recognition API และระบุสิทธิ์ com.google.android.gms.permission.ACTIVITY_RECOGNITION ในไฟล์ Manifest ของแอป

  1. ค้นหา 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'
  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. ตั้งค่าการเปลี่ยนกิจกรรมและขอการอัปเดต

หากต้องการเริ่มรับข้อมูลอัปเดตเกี่ยวกับการเปลี่ยนแปลงกิจกรรม คุณต้องติดตั้งใช้งานสิ่งต่อไปนี้

สร้างรายการ ActivitiyTransitions ที่จะติดตาม

หากต้องการสร้างออบเจ็กต์ ActivityTransitionRequest คุณต้องสร้างรายการออบเจ็กต์ ActivityTransition ซึ่งแสดงการเปลี่ยนสถานะที่ต้องการติดตาม ออบเจ็กต์ ActivityTransition มีข้อมูลต่อไปนี้

  1. ประเภทกิจกรรมที่แสดงโดยคลาส DetectedActivity Transition API รองรับกิจกรรมต่อไปนี้
  1. ประเภทการเปลี่ยนที่แสดงโดยคลาส 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. ตรวจสอบโค้ด

คุณได้สร้างแอปง่ายๆ ที่ติดตามการเปลี่ยนกิจกรรมและแสดงรายการเหล่านั้นบนหน้าจอ

คุณสามารถอ่านโค้ดทั้งหมดเพื่อดูสิ่งที่ทําไปและทําความเข้าใจการทํางานร่วมกันได้ดียิ่งขึ้น