1. Giới thiệu
Chúng ta mang theo điện thoại bên mình ở mọi nơi, nhưng cho đến nay, các ứng dụng khó có thể điều chỉnh trải nghiệm cho phù hợp với môi trường và hoạt động luôn thay đổi của người dùng.
Trước đây, để làm việc này, các nhà phát triển đã dành nhiều thời gian kỹ thuật quý báu để kết hợp nhiều tín hiệu (vị trí, cảm biến, v.v.) nhằm xác định thời điểm một hoạt động như đi bộ hoặc lái xe bắt đầu hoặc kết thúc. Thậm chí, khi các ứng dụng liên tục và độc lập kiểm tra các thay đổi trong hoạt động của người dùng, tuổi thọ pin sẽ bị ảnh hưởng.
API chuyển đổi nhận dạng hoạt động giải quyết những vấn đề này bằng cách cung cấp một API đơn giản, thực hiện mọi quy trình xử lý cho bạn và chỉ cho bạn biết những gì bạn thực sự quan tâm: thời điểm hoạt động của người dùng thay đổi. Ứng dụng của bạn chỉ cần đăng ký chuyển đổi theo các hoạt động bạn quan tâm và API sẽ thông báo cho bạn về những thay đổi
Ví dụ: ứng dụng nhắn tin có thể yêu cầu "cho tôi biết khi nào người dùng đã vào hoặc ra khỏi xe" để đặt trạng thái của người dùng là đang bận. Tương tự, một ứng dụng phát hiện hoạt động đỗ xe có thể yêu cầu "cho tôi biết khi nào người dùng đã ra khỏi xe và bắt đầu đi bộ" để lưu vị trí đỗ xe của người dùng.
Trong lớp học lập trình này, bạn sẽ tìm hiểu cách sử dụng API chuyển đổi nhận dạng hoạt động để xác định thời điểm người dùng bắt đầu/dừng một hoạt động như đi bộ hoặc chạy.
Điều kiện tiên quyết
Quen thuộc với quá trình phát triển Android và có hiểu biết về lệnh gọi lại.
Kiến thức bạn sẽ học được
- Đăng ký nhận thông tin về quá trình chuyển đổi hoạt động
- Xử lý những sự kiện đó
- Huỷ đăng ký nhận thông tin cập nhật về quá trình chuyển đổi hoạt động khi không cần thiết nữa
Bạn cần có
- Android Studio Bumblebee
- Trình mô phỏng hoặc thiết bị Android
2. Bắt đầu
Nhân bản kho lưu trữ dự án ban đầu
Để bạn có thể bắt đầu nhanh chóng, chúng tôi đã chuẩn bị một dự án khởi động để bạn tiếp tục xây dựng ứng dụng trên đó. Nếu đã cài đặt git, bạn có thể chỉ cần chạy lệnh bên dưới. (Bạn có thể kiểm tra bằng cách nhập git --version vào dòng lệnh / cửa sổ dòng lệnh và xác minh rằng lệnh đó thực thi đúng cách.)
git clone https://github.com/android/codelab-activity_transitionapi
Nếu không có git, bạn có thể tải dự án xuống dưới dạng tệp zip:
Nhập dự án
Khởi động Android Studio, chọn "Open an existing Android Studio project" ("Mở một dự án Android Studio hiện có") trên màn hình Welcome (Chào mừng) rồi mở thư mục dự án này.
Sau khi tải dự án, có thể bạn sẽ nhìn thấy cảnh báo cho biết Git không theo dõi tất cả các thay đổi cục bộ của bạn. Bạn có thể nhấp vào "Bỏ qua" hoặc "X" ở góc trên bên phải. (Bạn sẽ không đẩy thay đổi nào ngược trở lại kho lưu trữ Git.)
Ở góc trên bên trái cửa sổ dự án, bạn sẽ thấy như sau nếu đang ở chế độ xem Android. (Nếu đang ở chế độ xem Project (Dự án), bạn cần phải mở rộng dự án để thấy được như này.)

Có hai biểu tượng thư mục (base và complete). Mỗi thư mục này được gọi là một "mô-đun".
Hãy lưu ý rằng Android Studio có thể mất vài giây để biên dịch dự án ở chế độ nền trong lần đầu tiên. Trong khoảng thời gian này, bạn sẽ thấy một vòng quay trong thanh trạng thái ở phía dưới Android Studio:

Bạn nên đợi quá trình này hoàn tất trước khi chỉnh sửa mã nguồn. Quá trình này cho phép Android Studio chuẩn bị tất cả thành phần cần thiết.
Ngoài ra, nếu bạn thấy lời nhắc "Reload for language changes to take effect?" (Tải lại để áp dụng các thay đổi về ngôn ngữ?) hoặc tương tự, hãy chọn "Yes" ("Có").
Tìm hiểu dự án ban đầu
Bạn đã hoàn tất việc thiết lập dự án và sẵn sàng thêm tính năng nhận dạng hoạt động. Chúng ta sẽ dùng mô-đun base làm điểm khởi đầu cho lớp học lập trình này. Nói cách khác, bạn sẽ thêm mã nguồn trong mỗi bước vào base.
Mô-đun complete có thể được dùng để kiểm tra công việc của bạn hoặc dùng để tham khảo nếu bạn gặp vấn đề nào đó.
Tổng quan về các thành phần chính:
MainActivity: Chứa tất cả mã cần thiết để nhận dạng hoạt động.
Thiết lập trình mô phỏng
Nếu bạn cần trợ giúp thiết lập trình mô phỏng Android, hãy tham khảo bài viết Chạy ứng dụng.
Chạy dự án ban đầu
Giờ hãy chạy ứng dụng.
- Kết nối thiết bị Android với máy tính hoặc khởi động trình mô phỏng.
- Trong thanh công cụ, hãy chọn cấu hình
basetrên bộ chọn thả xuống rồi nhấp vào nút hình tam giác màu xanh lục (Run (Chạy)) bên cạnh:

- Bạn sẽ thấy ứng dụng bên dưới:

- Hiện tại, ứng dụng này không làm gì ngoài việc in một thông báo. Bây giờ, chúng ta sẽ thêm tính năng nhận dạng hoạt động.
Tóm tắt
Trong bước này, bạn đã tìm hiểu về:
- Thiết lập chung cho lớp học lập trình.
- Kiến thức cơ bản về ứng dụng của chúng tôi.
- Cách triển khai ứng dụng.
3. Xem xét thư viện và thêm quyền vào tệp kê khai
Để sử dụng Transition API trong ứng dụng, bạn phải khai báo một phần phụ thuộc cho Google Location and Activity Recognition API (API Nhận dạng vị trí và hoạt động của Google), đồng thời chỉ định quyền com.google.android.gms.permission.ACTIVITY_RECOGNITION trong tệp kê khai ứng dụng.
- Tìm chuỗi TODO: Review play services library required for activity recognition (CẦN LÀM: Xem xét thư viện Play cần thiết để nhận dạng hoạt động) trong tệp build.gradle. Bạn không cần làm gì trong bước này (bước 1), chỉ cần kiểm tra phần phụ thuộc đã khai báo mà chúng ta cần đến. Phần khai báo sẽ có dạng như sau:
// TODO: Review play services library required for activity recognition.
implementation 'com.google.android.gms:play-services-location:19.0.1'
- Trong mô-đun
base, hãy tìm chuỗi TODO: Add both activity recognition permissions to the manifest (CẦN LÀM: Thêm cả hai quyền nhận dạng hoạt động vào tệp kê khai) trongAndroidManifest.xmlrồi thêm mã nguồn bên dưới vào phần tử<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" />
Mã nguồn của bạn bây giờ sẽ trông như sau:
<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>
Như đã thấy trong phần chú thích, bạn cần thêm quyền thứ hai cho Android 10. Đây là yêu cầu bắt buộc đối với quyền khi bắt đầu chạy được thêm vào API phiên bản 29.
Vậy là xong! Ứng dụng của bạn giờ đây có thể hỗ trợ tính năng nhận dạng hoạt động, bạn chỉ cần thêm mã nguồn ở trên để sử dụng tính năng này.
Chạy ứng dụng
Chạy ứng dụng trong Android Studio. Nội dung này phải giống hệt nhau. Chúng ta vẫn chưa thực sự thêm mã nguồn nào để theo dõi các hiệu ứng chuyển đổi. Chúng ta sẽ thực hiện việc này trong phần tiếp theo.
4. Kiểm tra/Yêu cầu quyền khi bắt đầu chạy trên Android
Mặc dù đã có quyền truy cập vào API phiên bản 28 trở xuống, nhưng chúng ta cần hỗ trợ các quyền trong thời gian chạy ở API phiên bản 29 trở lên:
- Trong
MainActivity.java, chúng ta sẽ kiểm tra xem người dùng có đang dùng Android 10 (29) trở lên hay không. Nếu có, chúng ta sẽ kiểm tra quyền nhận dạng hoạt động. - Nếu người dùng không cấp quyền, chúng ta sẽ gửi họ đến màn hình chờ (
PermissionRationalActivity.java) để giải thích lý do ứng dụng cần quyền này và cho phép họ phê duyệt.
Xem lại mã kiểm tra phiên bản Android
Trong mô-đun base, hãy tìm chuỗi TODO: Review check for devices with Android 10 (29+) (CẦN LÀM: Xem xét kết quả kiểm tra cho các thiết bị chạy Android 10 (29+)) trong MainActivity.java. Bạn sẽ thấy đoạn mã nguồn dưới đây.
Lưu ý: bạn không cần làm gì trong bước này.
// TODO: Review check for devices with Android 10 (29+).
private boolean runningQOrLater =
android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.Q;
Như đã nêu trước đó, bạn cần được phê duyệt cho quyền khi bắt đầu chạy android.permission.ACTIVITY_RECOGNITION trong Android 10 trở lên. Chúng ta sử dụng bước kiểm tra đơn giản này để quyết định xem có cần kiểm tra quyền khi bắt đầu chạy hay không.
Xem xét kết quả kiểm tra quyền khi bắt đầu chạy để nhận dạng hoạt động nếu cần
Trong mô-đun base, hãy tìm chuỗi TODO: Review permission check for 29+ (CẦN LÀM: Xem xét kết quả kiểm tra quyền cho phiên bản 29 trở lên) trong MainActivity.java. Bạn sẽ thấy đoạn mã nguồn dưới đây.
Lưu ý: bạn không cần làm gì trong bước này.
// TODO: Review permission check for 29+.
if (runningQOrLater) {
return PackageManager.PERMISSION_GRANTED == ActivityCompat.checkSelfPermission(
this,
Manifest.permission.ACTIVITY_RECOGNITION
);
} else {
return true;
}
Chúng ta sử dụng biến mà chúng ta đã tạo ở bước trước để xem có cần kiểm tra quyền khi bắt đầu chạy hay không.
Đối với Q trở lên, chúng ta sẽ kiểm tra và trả về kết quả cho quyền khi bắt đầu chạy. Đây là một phần của phương thức lớn hơn có tên là activityRecognitionPermissionApproved(). Phương thức này cho phép nhà phát triển biết trong một lệnh gọi đơn giản liệu chúng ta có cần yêu cầu cấp quyền hay không.
Yêu cầu quyền khi bắt đầu chạy và bật/tắt các chuyển đổi nhận dạng hoạt động
Trong mô-đun base, hãy tìm chuỗi TODO: Enable/Disable activity tracking and ask for permissions if needed (CẦN LÀM: Bật/tắt tính năng theo dõi hoạt động và yêu cầu cấp quyền nếu cần) trong MainActivity.java. Thêm mã dưới đây sau phần nhận xét.
// 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);
}
Ở đây, chúng ta sẽ hỏi xem quyền nhận dạng hoạt động có được phê duyệt hay không. Nếu có và tính năng nhận dạng hoạt động đã được bật, chúng ta sẽ tắt tính năng này. Nếu không, chúng tôi sẽ bật tính năng này.
Trong trường hợp quyền này không được phê duyệt, chúng ta sẽ gửi cho người dùng hoạt động màn hình chờ để giải thích lý do chúng ta cần quyền này cũng như cho phép người dùng cấp quyền đó.
Xem xét mã yêu cầu cấp quyền
Trong mô-đun base, hãy tìm chuỗi TODO: Review permission request for activity recognition (CẦN LÀM: Xem xét yêu cầu cấp quyền nhận dạng hoạt động) trong PermissionRationalActivity.java. Bạn sẽ thấy đoạn mã nguồn dưới đây.
Lưu ý: bạn không cần làm gì trong bước này.
// TODO: Review permission request for activity recognition.
ActivityCompat.requestPermissions(
this,
new String[]{Manifest.permission.ACTIVITY_RECOGNITION},
PERMISSION_REQUEST_ACTIVITY_RECOGNITION)
Đây là phần quan trọng nhất của Hoạt động và là phần cần xem xét. Mã này kích hoạt yêu cầu cấp quyền khi người dùng yêu cầu.
Ngoài ra, lớp PermissionRationalActivity.java sẽ hiển thị lý do tại sao người dùng nên phê duyệt quyền nhận dạng hoạt động (phương pháp hay nhất). Người dùng có thể nhấp vào nút Không, cảm ơn hoặc nút Tiếp tục (nút này sẽ kích hoạt mã ở trên).
Bạn có thể xem xét tệp này nếu muốn tìm hiểu thêm.
5. Đăng ký/Huỷ đăng ký broadcast receiver cho các lượt chuyển đổi hoạt động
Trước khi thiết lập mã nhận dạng hoạt động, chúng ta cần đảm bảo Hoạt động của mình có thể xử lý các thao tác chuyển đổi do hệ thống đưa ra.
Tạo BroadcastReceiver cho hiệu ứng chuyển đổi
Trong mô-đun base, hãy tìm chuỗi TODO: Create a BroadcastReceiver to listen for activity transitions (CẦN LÀM: Tạo một BroadcastReceiver để theo dõi các lượt chuyển đổi hoạt động) trong MainActivity.java. Dán đoạn mã bên dưới.
// 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();
Đăng ký BroadcastReceiver cho quá trình chuyển đổi
Trong mô-đun base, hãy tìm chuỗi TODO: Register a BroadcastReceiver to listen for activity transitions (CẦN LÀM: Đăng ký BroadcastReceiver để theo dõi các lượt chuyển đổi hoạt động) trong MainActivity.java. (Đoạn mã này nằm trong onStart()). Dán đoạn mã bên dưới.
// TODO: Register a BroadcastReceiver to listen for activity transitions.
registerReceiver(mTransitionsReceiver, new IntentFilter(TRANSITIONS_RECEIVER_ACTION));
Bây giờ, chúng ta đã có cách để nhận thông tin cập nhật khi các quá trình chuyển đổi hoạt động được tạo thông qua PendingIntent.
Huỷ đăng ký BroadcastReceiver
Trong mô-đun base, hãy tìm chuỗi Unregister activity transition receiver when user leaves the app (Huỷ đăng ký bộ nhận quá trình chuyển đổi hoạt động khi người dùng rời khỏi ứng dụng) trong MainActivity.java. (Đoạn mã này nằm trong onStop()).Dán đoạn mã bên dưới.
// TODO: Unregister activity transition receiver when user leaves the app.
unregisterReceiver(mTransitionsReceiver);
Phương pháp hay nhất là huỷ đăng ký một receiver khi Activity đang tắt.
6. Thiết lập hiệu ứng chuyển đổi hoạt động và yêu cầu cập nhật
Để bắt đầu nhận thông tin cập nhật về việc chuyển đổi hoạt động, bạn phải triển khai:
- Một đố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 của bạn nhận được thông báo. Để biết thêm thông tin, hãy xem phần sử dụng ý định đang chờ xử lý.
Tạo danh sách ActivityTransition để theo dõi
Để tạo đối tượng ActivityTransitionRequest, bạn phải tạo một danh sách các đối tượng ActivityTransition đại diện cho quá trình chuyển đổi mà bạn muốn theo dõi. Đố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. Transition API hỗ trợ những hoạt động sau:
- Một loại chuyển đổi, được biểu thị bằng lớp ActivityTransition. Các loại chuyển đổi là:
Trong mô-đun base, hãy tìm chuỗi TODO: Add activity transitions to track (CẦN LÀM: Thêm các quá trình chuyển đổi hoạt động để theo dõi) trong MainActivity.java. Thêm mã dưới đây sau phần nhận xét.
// 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());
Đoạn mã này sẽ thêm các hiệu ứng chuyển đổi mà chúng ta muốn theo dõi vào một danh sách trống trước đó.
Tạo một PendingIntent
Như đã đề cập trước đó, chúng ta cần một PendingIntent nếu muốn được cảnh báo về mọi thay đổi trong ActivityTransitionRequest. Vì vậy, trước khi thiết lập ActivityTransitionRequest, chúng ta cần tạo một PendingIntent.
Trong mô-đun base, hãy tìm chuỗi TODO: Initialize PendingIntent that will be triggered when a activity transition occurs (CẦN LÀM: Khởi động PendingIntent sẽ được kích hoạt khi quá trình chuyển đổi hoạt động diễn ra) trong MainActivity.java. Thêm mã dưới đây sau phần nhận xét.
// 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);
Giờ đây, chúng ta có một PendingIntent mà chúng ta có thể kích hoạt khi một trong các ActivityTransition xảy ra.
Tạo một ActivityTransitionRequest và yêu cầu cập nhật
Bạn có thể tạo đối tượng ActivityTransitionRequest bằng cách truyền danh sách ActivityTransition vào lớp ActivityTransitionRequest.
Trong mô-đun base, hãy tìm chuỗi Create request and listen for activity changes (Tạo yêu cầu và theo dõi các thay đổi về hoạt động) trong MainActivity.java. Thêm mã dưới đây sau phần nhận xét.
// 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);
}
});
Hãy xem lại mã này. Trước tiên, chúng ta tạo một ActivityTransitionRequest từ danh sách chuyển đổi hoạt động.
ActivityTransitionRequest request = new ActivityTransitionRequest(activityTransitionList);
Tiếp theo, chúng ta đă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 phiên bản ActivityTransitionRequest và đối tượng PendingIntent mà chúng ta đã tạo ở bước cuối cùng vào phương thức requestActivityTransitionUpdates(). Phương thức requestActivityTransitionUpdates() trả về một đối tượng Task mà bạn có thể kiểm tra xem có thành công hay không, như minh hoạ trong khối mã tiếp theo:
// 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);
}
});
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 của bạn sẽ nhận được thông báo trong PendingIntent đã đăng ký. Chúng ta cũng đặt một biến cho biết tính năng theo dõi hoạt động đã được bật để biết có nên tắt/bật tính năng này hay không nếu người dùng nhấp lại vào nút.
Xoá bản cập nhật khi ứng dụng đóng
Điều quan trọng là chúng ta phải xoá các bản cập nhật hiệu ứng chuyển đổi khi ứng dụng đóng.
Trong mô-đun base, hãy tìm chuỗi Stop listening for activity changes (Ngừng theo dõi các thay đổi về hoạt động) trong MainActivity.java. Thêm mã dưới đây sau phần nhận xét.
// 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);
}
});
Bây giờ, chúng ta cần gọi phương thức chứa mã ở trên khi ứng dụng tắt
Trong mô-đun base, hãy tìm chuỗi TODO: Disable activity transitions when user leaves the app (CẦN LÀM: Tắt các quá trình chuyển đổi hoạt động khi người dùng rời khỏi ứng dụng) trong MainActivity.java trong onPause(). Thêm mã dưới đây sau phần nhận xét.
// TODO: Disable activity transitions when user leaves the app.
if (activityTrackingEnabled) {
disableActivityTransitions();
}
Đó là tất cả những gì cần làm để theo dõi các thay đổi đối với hiệu ứng chuyển đổi hoạt động. Giờ ta chỉ cần xử lý các bản cập nhật.
7. Xử lý sự kiện
Khi quá trình chuyển đổi hoạt động được yêu cầu diễn ra, ứng dụng của bạn sẽ nhận được một lệnh gọi lại Intent. Bạn có thể trích xuất một đối tượng ActivityTransitionResult 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 một ứng dụng yêu cầu loại hoạt động IN_VEHICLE trên các trạng thái chuyển đổi ACTIVITY_TRANSITION_ENTER và ACTIVITY_TRANSITION_EXIT, thì ứng dụng đó sẽ nhận được một đố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 sang bất kỳ hoạt động nào khác.
Hãy thêm mã nguồn sau đây để xử lý các sự kiện đó.
Trong mô-đun base, hãy tìm chuỗi TODO: Extract activity transition information from listener (CẦN LÀM: Trích xuất thông tin về quá trình chuyển đổi hoạt động từ trình nghe) trong MainActivity.java trong onReceive() của BroadcastReceiver mà chúng ta đã tạo trước đó. Thêm mã dưới đây sau phần nhận xét.
// 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);
}
}
Thao tác này sẽ chuyển đổi thông tin thành String và in thông tin đó ra màn hình.
Vậy là xong! Bạn đã hoàn thành ứng dụng! Bạn có thể chạy ứng dụng để xem thành quả của mình.
LƯU Ý QUAN TRỌNG: Rất khó để tái tạo các thay đổi về hoạt động trên trình mô phỏng, vì vậy, bạn nên sử dụng một thiết bị thực tế.
Bạn có thể theo dõi các thay đổi về hoạt động.
Để có kết quả tốt nhất, hãy cài đặt ứng dụng trên một thiết bị thực và đi bộ xung quanh. :)
8. Xem lại mã
Bạn đã tạo một ứng dụng đơn giản theo dõi các lượt chuyển đổi Hoạt động và liệt kê các lượt chuyển đổi đó trên màn hình.
Hãy đọc toàn bộ mã nguồn để xem lại những gì bạn đã làm cũng như để hiểu rõ hơn về cách thức hoạt động của những mã nguồn này.