1. Giới thiệu
Chúng ta mang theo điện thoại ở mọi nơi, nhưng cho đến nay, các ứng dụng vẫn khó điều chỉnh trải nghiệm của mình cho phù hợp với môi trường và hoạt động liên tục thay đổi của người dùng.
Trước đây, để làm được việc này, các nhà phát triển đã dành thời gian kỹ thuật quý giá để 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. Tệ hơn nữa, khi các ứng dụng liên tục và độc lập kiểm tra những thay đổi trong hoạt động của người dùng, thời lượng 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 hoạt động 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 rời khỏi xe" để đặt trạng thái của người dùng thành bận. Tương tự, ứng dụng phát hiện vị trí đỗ xe có thể hỏi: "cho tôi biết thời điểm người dùng đã rời 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 bộ.
Điều kiện tiên quyết
Quen thuộc với việc phát triển Android và một số kiến thức về lệnh gọi lại.
Kiến thức bạn sẽ học được
- Đăng ký chuyển đổi hoạt động
- Xử lý các sự kiện đó
- Huỷ đăng ký 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 đầu để bạn tiếp tục xây dựng ứng dụng từ đó. 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 mã này 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 "Ignore" (Bỏ qua) hoặc biểu tượng "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 một hình ảnh như hình bên dưới 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 ý 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 khởi đầ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.
- Trên thanh công cụ, hãy chọn cấu hình
base
trên bộ chọn thả xuống và 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:
- Ứng dụng hiện không làm gì ngoài việc in 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ề:
- Cách 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 ta.
- 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 API chuyển đổi trong ứng dụng, bạn phải khai báo phần phụ thuộc cho 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. Ứng dụng sẽ hiển thị 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.xml
rồi thêm mã 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 một quyền thứ hai cho Android 10. Điều này là 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, chúng ta 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 sẽ giống hệt như trước. Chúng ta vẫn chưa thực sự thêm mã nguồn nào để theo dõi các lượt 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 trong Android
Mặc dù chúng tôi đã hỗ trợ quyền trên API phiên bản 28 trở xuống, nhưng chúng tôi cần hỗ trợ quyền khi bắt đầu chạy trong 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 sử 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 quyền không được cấp, chúng ta sẽ chuyển người dùng đến màn hình chờ (
PermissionRationalActivity.java
) để giải thích lý do ứng dụng cần quyền đó và cho phép họ phê duyệt quyền.
Xem xét 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: Kiểm tra xem xét cho các thiết bị chạy Android 10 (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 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 quyền khi bắt đầu chạy android.permission.ACTIVITY_RECOGNITION
trong Android 10 trở lên. Chúng ta sử dụng quy trình 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 Android 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 đã 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 phiên bản 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 một phương thức lớn hơn có tên là activityRecognitionPermissionApproved()
. Phương thức này cho 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 vào sau phần chú thích.
// 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);
}
Tại đây, chúng ta sẽ hỏi xem tính năng 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 tôi sẽ tắt tính năng này. Nếu không, chúng ta 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
cho biết lý do 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 No Thanks (Không, cảm ơn) hoặc nút Continue (Tiếp tục) (nút này sẽ kích hoạt mã ở trên).
Vui lòng xem lại tệp này nếu bạn muốn tìm hiểu thêm.
5. Đăng ký/Huỷ đăng ký trình thu nhận 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 muốn đảm bảo rằng Hoạt động của mình có thể xử lý các hành động chuyển đổi do hệ thống đưa ra.
Tạo BroadcastReceiver cho quá trình 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 BroadcastReceiver để nghe 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 để nghe các lượt chuyển đổi hoạt động) trong MainActivity.java
. (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 lượt chuyển đổi hoạt động được đưa ra thông qua PendingIntent.
Huỷ đăng ký BroadcastReceiver
Trong mô-đun base
, hãy tìm chuỗi Huỷ đăng ký trình nhận chuyển đổi hoạt động khi người dùng rời khỏi ứng dụng trong MainActivity.java
. (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);
Bạn nên huỷ đăng ký trình thu nhận khi Activity
đang tắt.
6. Thiết lập các 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:
- Đố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 ActivitiyTransitions cần theo dõi
Để 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 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. API chuyển đổi 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ác loại chuyển đổi sau:
Trong mô-đun base
, hãy tìm chuỗi TODO: Add activity transitions to track (CẦN LÀM: Thêm các lượt chuyển đổi hoạt động để theo dõi) trong MainActivity.java
. Thêm mã dưới đây vào sau phần chú thích.
// 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());
Mã này thêm các hiệu ứng chuyển đổi mà chúng ta muốn theo dõi vào danh sách trống trước đó.
Tạo PendingIntent
Như đã nêu trước đó, chúng ta cần có PendingIntent
nếu muốn được thông 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 chạy PendingIntent sẽ được kích hoạt khi quá trình chuyển đổi hoạt động xảy ra) trong MainActivity.java
. Thêm mã dưới đây vào sau phần chú thích.
// 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);
Bây giờ, 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 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 ActivityTransitions 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 vào sau phần chú thích.
// 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ã. 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 truyền thực thể của 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 (Tác vụ) mà bạn có thể kiểm tra xem có thành công hay không, như 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 sẽ nhận được thông báo trong PendingIntent đã đăng ký. Chúng ta cũng đặt một biến bật tính năng theo dõi hoạt động để cho phép chúng ta biết liệu có nên tắt/bật nếu người dùng nhấp lại vào nút hay không.
Xoá bản cập nhật khi ứng dụng đang đóng
Điều quan trọng là chúng ta phải xoá các bản cập nhật chuyển đổi khi ứng dụng đang đóng.
Trong mô-đun base
, hãy tìm chuỗi Stop listening for activity changes (Dừng theo dõi các thay đổi về hoạt động) trong MainActivity.java
. Thêm mã dưới đây vào sau phần chú thích.
// 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 đang 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 tính năng 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 vào sau phần chú thích.
// 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 quá trình chuyển đổi hoạt động. Bây giờ, chúng 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 sẽ nhận được một lệnh gọi lại Ý định. Bạn có thể trích xuất đối tượng ActivityTransitionResult từ Ý định, 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ầu loại hoạt động IN_VEHICLE trên các lượt chuyển đổi ACTIVITY_TRANSITION_ENTER và ACTIVITY_TRANSITION_EXIT, thì ứng dụng sẽ 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.
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 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 vào sau phần chú thích.
// 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 thiết bị thực.
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 lại. :)
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.