Khi bắt đầu một hoạt động từ thông báo, bạn phải duy trì trải nghiệm điều hướng mà người dùng mong đợi. Khi nhấn nút Quay lại, người dùng phải quay lại Màn hình chính thông qua quy trình làm việc bình thường của ứng dụng và khi mở màn hình Gần đây, hoạt động phải xuất hiện dưới dạng một tác vụ riêng biệt. Để duy trì trải nghiệm điều hướng này, hãy bắt đầu hoạt động trong một tác vụ mới.
Phương pháp cơ bản để thiết lập hành vi nhấn cho thông báo được mô tả trong phần Tạo thông báo cơ bản. Trang này mô tả cách thiết lập một PendingIntent cho thao tác của thông báo để thao tác này tạo một tác vụ và ngăn xếp lui mới. Cách bạn thực hiện việc này phụ thuộc vào loại hoạt động mà bạn đang bắt đầu:
- Hoạt động thông thường: Đây là hoạt động tồn tại như một phần trong quy trình trải nghiệm người dùng thông thường của ứng dụng. Khi người dùng truy cập vào hoạt động từ thông báo, tác vụ mới phải bao gồm một ngăn xếp lui hoàn chỉnh, cho phép người dùng nhấn vào nút Quay lại để di chuyển lên hệ phân cấp ứng dụng.
- Hoạt động đặc biệt: Người dùng chỉ thấy hoạt động này nếu hoạt động đó bắt đầu từ một thông báo. Theo một nghĩa nào đó, hoạt động này mở rộng giao diện người dùng thông báo bằng cách cung cấp thông tin khó hiển thị trong chính thông báo. Hoạt động này không cần ngăn xếp lui.
Thiết lập PendingIntent cho hoạt động thông thường
Để bắt đầu một hoạt động thông thường từ thông báo, hãy thiết lập PendingIntent bằng cách sử dụng TaskStackBuilder để tạo một ngăn xếp lui mới như sau.
Xác định hệ phân cấp Hoạt động của ứng dụng
Xác định hệ phân cấp tự nhiên cho các hoạt động bằng cách thêm thuộc tính android:parentActivityName vào từng phần tử <activity> trong tệp kê khai ứng dụng. Hãy xem ví dụ sau:
<activity android:name=".MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <!-- MainActivity is the parent for ResultActivity. --> <activity android:name=".ResultActivity" android:parentActivityName=".MainActivity" /> ... </activity>
Tạo PendingIntent bằng ngăn xếp lui
Để bắt đầu một hoạt động bao gồm một ngăn xếp lui các hoạt động, hãy tạo một thực thể của TaskStackBuilder và gọi addNextIntentWithParentStack(), truyền cho thực thể đó Intent cho hoạt động mà bạn muốn bắt đầu.
Miễn là bạn xác định hoạt động mẹ cho từng hoạt động như mô tả ở trên, bạn có thể gọi getPendingIntent() để nhận PendingIntent bao gồm toàn bộ ngăn xếp lui.
// Create an Intent for the activity you want to start. val resultIntent = Intent(this, ResultActivity::class.java) // Create the TaskStackBuilder. val resultPendingIntent: PendingIntent? = TaskStackBuilder.create(this).run { // Add the intent, which inflates the back stack. addNextIntentWithParentStack(resultIntent) // Get the PendingIntent containing the entire back stack. getPendingIntent( 0, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE ) }
Nếu cần, bạn có thể thêm các đối số vào các đối tượng Intent trong ngăn xếp bằng cách gọi TaskStackBuilder.editIntentAt(). Đôi khi, việc này là cần thiết để đảm bảo rằng một hoạt động trong ngăn xếp lui hiển thị dữ liệu có ý nghĩa khi người dùng chuyển đến hoạt động đó.
Sau đó, bạn có thể truyền PendingIntent đến thông báo như bình thường:
val builder = NotificationCompat.Builder(this, CHANNEL_ID).apply { setContentIntent(resultPendingIntent) // ... } with(NotificationManagerCompat.from(this)) { notify(NOTIFICATION_ID, builder.build()) }
Thiết lập một PendingIntent cho hoạt động đặc biệt
Vì một hoạt động đặc biệt bắt đầu từ một thông báo không cần ngăn xếp lui, nên bạn có thể tạo PendingIntent bằng cách gọi getActivity().
Tuy nhiên, hãy xác định các lựa chọn thích hợp cho tác vụ trong tệp kê khai.
Trong tệp kê khai, hãy thêm các thuộc tính sau vào phần tử
<activity>.android:taskAffinity=""- Kết hợp với cờ
FLAG_ACTIVITY_NEW_TASKmà bạn dùng trong mã, hãy đặt thuộc tính này thành trống để đảm bảo hoạt động này không chuyển sang tác vụ mặc định của ứng dụng. Mọi tác vụ hiện có có mối liên kết mặc định của ứng dụng đều không bị ảnh hưởng. android:excludeFromRecents="true"- Loại trừ tác vụ mới khỏi màn hình Gần đây để người dùng không vô tình quay lại tác vụ đó.
Lệnh này được minh hoạ trong ví dụ sau:
<activity android:name=".ResultActivity" android:launchMode="singleTask" android:taskAffinity="" android:excludeFromRecents="true"> </activity>
Tạo và gửi thông báo:
- Tạo một
Intentkhởi độngActivity. - Đặt
Activityđể bắt đầu trong một tác vụ mới, trống bằng cách gọisetFlags()bằng các cờFLAG_ACTIVITY_NEW_TASKvàFLAG_ACTIVITY_CLEAR_TASK. - Tạo
PendingIntentbằng cách gọigetActivity().
Lệnh này được minh hoạ trong ví dụ sau:
val notifyIntent = Intent(this, ResultActivity::class.java).apply { flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK } val notifyPendingIntent = PendingIntent.getActivity( this, 0, notifyIntent, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE )
- Tạo một
Truyền
PendingIntentvào thông báo như bình thường:val builder = NotificationCompat.Builder(this, CHANNEL_ID).apply { setContentIntent(notifyPendingIntent) // ... } with(NotificationManagerCompat.from(this)) { notify(NOTIFICATION_ID, builder.build()) }
Để biết thêm thông tin về các lựa chọn tác vụ và cách hoạt động của ngăn xếp lui, hãy xem phần Tác vụ và ngăn xếp lui.