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 ไม่ได้ติดตามการเปลี่ยนแปลงในเครื่องทั้งหมด คุณสามารถคลิก "Ignore" หรือ "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: 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'
  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 มีข้อมูลต่อไปนี้

  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: 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. ตรวจสอบโค้ด

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

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