Có thể bạn phải thiết kế ứng dụng để xác định thời điểm người dùng bắt đầu hoặc dừng một hoạt động cụ thể, chẳng hạn như đi bộ, đi xe đạp hoặc lái xe. Ví dụ: ứng dụng theo dõi số dặm có thể bắt đầu theo dõi dặm đường khi người dùng bắt đầu lái xe hoặc ứng dụng nhắn tin có thể tắt tiếng tất cả các cuộc trò chuyện cho đến khi người dùng dừng lái xe.
Bạn có thể sử dụng API chuyển đổi nhận dạng hoạt động để phát hiện các thay đổi trong hoạt động của người dùng. Ứng dụng sẽ đăng ký chuyển đổi theo các hoạt động bạn quan tâm và API chỉ thông báo cho ứng dụng khi cần. Trang này trình bày cách sử dụng API chuyển tiếp nhận dạng hoạt động, gọi tắt là API chuyển đổi.
Thiết lập dự án
Để sử dụng API chuyển đổi trong ứng dụng, bạn phải khai báo phần phụ thuộc Nhận dạng vị trí và hoạt động của Google API phiên bản 12.0.0 trở lên và chỉ định quyền cho ứng dụng com.google.android.gms.permission.ACTIVITY_RECOGNITION
trong tệp kê khai ứng dụng.
- Để khai báo phần phụ thuộc với API, hãy thêm một tệp tham chiếu đến kho lưu trữ của Google và thêm mục nhập triển khai vào phần phụ thuộc
com.google.android.gms:play-services-location:12.0.0
của tệpbuild.gradle
trong ứng dụng. Để biết thêm thông tin, hãy xem nội dung Thiết lập Dịch vụ Google Play. Để chỉ định quyền
com.google.android.gms.permission.ACTIVITY_RECOGNITION
, hãy đưa phần tử<uses-permission>
vào tệp kê khai ứng dụng như trong ví dụ sau:<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.myapp"> <uses-permission android:name="com.google.android.gms.permission.ACTIVITY_RECOGNITION" /> … </manifest>
Đăng ký nhận thông tin cập nhật về việc chuyển đổi hoạt động
Để nhận được thông báo về việc chuyển đổi hoạt động, bạn phải triển khai các nội dung sau:
- Đối tượng
ActivityTransitionRequest
chỉ định loại hoạt động và quá trình chuyển đổi. - Lệnh gọi lại
PendingIntent
mà ứng dụng đã nhận được thông báo. Để biết thêm thông tin, hãy xem bài viết Sử dụng ý định đang chờ xử lý.
Để tạo đối tượng ActivityTransitionRequest
, bạn phải tạo danh sách các đối tượng ActivityTransition
đại diện cho chuyển đổi mà bạn muốn nhận thông báo. Đối tượng ActivityTransition
bao gồm các dữ liệu sau:
- Một loại hoạt động, được biểu thị bằng lớp
DetectedActivity
. API chuyển đổi hỗ trợ những hoạt động sau đây: - Loại chuyển đổi
ACTIVITY_TRANSITION_ENTER
hoặcACTIVITY_TRANSITION_EXIT
. Để biết thêm thông tin, hãy tham khảo lớpActivityTransition
.
Mã sau đây cho biết cách tạo danh sách đối tượng ActivityTransition
:
Kotlin
val transitions = mutableListOf<ActivityTransition>() transitions += ActivityTransition.Builder() .setActivityType(DetectedActivity.IN_VEHICLE) .setActivityTransition(ActivityTransition.ACTIVITY_TRANSITION_ENTER) .build() transitions += ActivityTransition.Builder() .setActivityType(DetectedActivity.IN_VEHICLE) .setActivityTransition(ActivityTransition.ACTIVITY_TRANSITION_EXIT) .build() transitions += ActivityTransition.Builder() .setActivityType(DetectedActivity.WALKING) .setActivityTransition(ActivityTransition.ACTIVITY_TRANSITION_EXIT) .build()
Java
List<ActivityTransition> transitions = new ArrayList<>(); transitions.add( new ActivityTransition.Builder() .setActivityType(DetectedActivity.IN_VEHICLE) .setActivityTransition(ActivityTransition.ACTIVITY_TRANSITION_ENTER) .build()); transitions.add( new ActivityTransition.Builder() .setActivityType(DetectedActivity.IN_VEHICLE) .setActivityTransition(ActivityTransition.ACTIVITY_TRANSITION_EXIT) .build()); transitions.add( new ActivityTransition.Builder() .setActivityType(DetectedActivity.WALKING) .setActivityTransition(ActivityTransition.ACTIVITY_TRANSITION_EXIT) .build());
Có thể tạo đối tượng ActivityTransitionRequest
bằng cách chuyển danh sách ActivityTransitions
đến lớpActivityTransitionRequest
, như ở ví dụ sau:
Kotlin
val request = ActivityTransitionRequest(transitions)
Java
ActivityTransitionRequest request = new ActivityTransitionRequest(transitions);
Bạn có thể đăng ký nhận thông tin cập nhật về việc chuyển đổi hoạt động bằng cách chuyển bản sao của ActivityTransitionRequest
và đối tượng PendingIntent
vào requestActivityTransitionUpdates()
. Phương thức requestActivityTransitionUpdates()
trả về đối tượng Task
và bạn có thể kiểm tra xem có thành công hay không, như trong mã sau ví dụ:
Kotlin
// myPendingIntent is the instance of PendingIntent where the app receives callbacks. val task = ActivityRecognition.getClient(context) .requestActivityTransitionUpdates(request, myPendingIntent) task.addOnSuccessListener { // Handle success } task.addOnFailureListener { e: Exception -> // Handle error }
Java
// myPendingIntent is the instance of PendingIntent where the app receives callbacks. Task<Void> task = ActivityRecognition.getClient(context) .requestActivityTransitionUpdates(request, myPendingIntent); task.addOnSuccessListener( new OnSuccessListener<Void>() { @Override public void onSuccess(Void result) { // Handle success } } ); task.addOnFailureListener( new OnFailureListener() { @Override public void onFailure(Exception e) { // Handle error } } );
Sau khi đăng ký thành công thông tin cập nhật về việc chuyển đổi hoạt động, ứng dụng sẽ nhận được thông báo trong PendingIntent
đã đăng ký.
Xử lý sự kiện chuyển đổi hoạt động
Khi quá trình chuyển đổi hoạt động được yêu cầu diễn ra, ứng dụng sẽ nhận được một lệnh gọi lại Intent
. Một đối tượng ActivityTransitionResult
có thể được trích xuất từIntent
, trong đó có một danh sách các đối tượng ActivityTransitionEvent
. Các sự kiện được sắp xếp theo trình tự thời gian, ví dụ: nếu ứng dụng yêu cầuIN_VEHICLE
cho loại hoạt động trên ACTIVITY_TRANSITION_ENTER
và chuyển đổi ACTIVITY_TRANSITION_EXIT
thì nhận được đối tượng ActivityTransitionEvent
khi người dùng bắt đầu lái xe, và một đối tượng khác khi người dùng chuyển đổi sang bất kỳ hoạt động nào khác.
Bạn có thể triển khai hàm gọi lại bằng cách tạo một lớp con của BroadcastReceiver
và triển khai phương thức onReceive()
để nhận danh sách các sự kiện chuyển đổi hoạt động. Để biết thêm thông tin, hãy xem nội dung Chương trình phát sóng. Ví dụ sau cho thấy cách triển khai phương thức onReceive()
:
Kotlin
override fun onReceive(context: Context, intent: Intent) { if (ActivityTransitionResult.hasResult(intent)) { val result = ActivityTransitionResult.extractResult(intent)!! for (event in result.transitionEvents) { // chronological sequence of events.... } } }
Java
@Override public void onReceive(Context context, Intent intent) { if (ActivityTransitionResult.hasResult(intent)) { ActivityTransitionResult result = ActivityTransitionResult.extractResult(intent); for (ActivityTransitionEvent event : result.getTransitionEvents()) { // chronological sequence of events.... } } }
Hủy đăng ký nhận thông tin cập nhật về việc chuyển đổi hoạt động
Có thể hủy đăng ký nhận thông tin cập nhật về hoạt động chuyển đổi bằng cách gọi phương thức removeActivityTransitionUpdates()
của ActivityRecognitionClient
và chuyển đối tượng PendingIntent
dưới dạng thông số, như hiển thị ở ví dụ sau:
Kotlin
// myPendingIntent is the instance of PendingIntent where the app receives callbacks. val task = ActivityRecognition.getClient(context) .removeActivityTransitionUpdates(myPendingIntent) task.addOnSuccessListener { myPendingIntent.cancel() } task.addOnFailureListener { e: Exception -> Log.e("MYCOMPONENT", e.message) }
Java
// myPendingIntent is the instance of PendingIntent where the app receives callbacks. Task<Void> task = ActivityRecognition.getClient(context) .removeActivityTransitionUpdates(myPendingIntent); task.addOnSuccessListener( new OnSuccessListener<Void>() { @Override public void onSuccess(Void result) { myPendingIntent.cancel(); } } ); task.addOnFailureListener( new OnFailureListener() { @Override public void onFailure(Exception e) { Log.e("MYCOMPONENT", e.getMessage()); } } );
Tài nguyên khác
Để tìm hiểu thêm về cách sử dụng API nhận dạng hoạt động của người dùng, hãy xem các tài liệu sau:
Mẫu
Mẫu minh hoạ các phương pháp hay nhất để nhận dạng hoạt động của người dùng.