Khi bắt đầu một hoạt động trên một thông báo, bạn phải giữ nguyên thông tin trải nghiệm điều hướng dự kiến. Thao tác nhấn vào nút Quay lại sẽ đưa người dùng quay lại qua quy trình công việc thông thường của ứng dụng đến Màn hình chính và mở mục Gần đây màn hình phải hiển thị hoạt động dưới dạng một tác vụ riêng biệt. Để duy trì lộ trình di chuyển này trải nghiệm, 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
Tạo một quy tắc cơ bản
thông báo.
Trang này mô tả cách thiết lập
PendingIntent
cho
hành động của thông báo để tạo một tác vụ và thao tác quay lại mới
ngăn xếp. Cách thực hiện
phụ thuộc vào loại hoạt động bạn đang bắt đầu:
- Hoạt động thông thường
- Đây là hoạt động nằm trong quy trình trải nghiệm người dùng thông thường của ứng dụng. Thời gian người dùng truy cập vào hoạt động từ thông báo, thì 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 để điều hướng lên hệ thống phân cấp ứng dụng.
- Hoạt động đặc biệt
- Người dùng chỉ nhìn thấy hoạt động này nếu hoạt động bắt đầu từ một thông báo. Trong một hoạt động này mở rộng giao diện người dùng của thông báo bằng cách cung cấp thông tin rất khó để hiển thị trong thông báo. Hoạt động này không cần có ngăn xếp lui.
Thiết lập một PendingIntent hoạt động thông thường
Để bắt đầu một hoạt động thông thường từ thông báo của bạn, hãy thiết lập PendingIntent
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 của bạn bằng cách thêm phương thức
android:parentActivityName
cho mỗi <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 gồm các hoạt động, hãy tạo một
thực thể của TaskStackBuilder
và gọi
addNextIntentWithParentStack()
,
truyền phương thức này Intent
cho
mà bạn muốn bắt đầu.
Miễn là bạn xác định hoạt động gốc cho từng hoạt động như mô tả
sớm hơn, bạn có thể gọi
getPendingIntent()
để nhận một PendingIntent
bao gồm toàn bộ ngăn xếp lui.
Kotlin
// 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) }
Java
// Create an Intent for the activity you want to start. Intent resultIntent = new Intent(this, ResultActivity.class); // Create the TaskStackBuilder and add the intent, which inflates the back // stack. TaskStackBuilder stackBuilder = TaskStackBuilder.create(this); stackBuilder.addNextIntentWithParentStack(resultIntent); // Get the PendingIntent containing the entire back stack. PendingIntent resultPendingIntent = stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE);
Nếu cần, bạn có thể thêm đối số vào đối tượng Intent
trong ngăn xếp bằng cách gọi
TaskStackBuilder.editIntentAt()
.
Điều này đôi khi 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 đó.
Sau đó, bạn có thể chuyển PendingIntent
đến thông báo như bình thường:
Kotlin
val builder = NotificationCompat.Builder(this, CHANNEL_ID).apply { setContentIntent(resultPendingIntent) ... } with(NotificationManagerCompat.from(this)) { notify(NOTIFICATION_ID, builder.build()) }
Java
NotificationCompat.Builder builder = new NotificationCompat.Builder(this, CHANNEL_ID); builder.setContentIntent(resultPendingIntent); ... NotificationManagerCompat notificationManager = NotificationManagerCompat.from(this); notificationManager.notify(NOTIFICATION_ID, builder.build());
Thiết lập một hoạt động đặc biệt PendingIntent
Vì hoạt động đặc biệt bắt đầu từ thông báo không cần quay lại
ngăn xếp, bạn có thể tạo PendingIntent
bằng cách gọi
getActivity()
.
Tuy nhiên, hãy xác định các tuỳ chọn tác vụ thích hợp 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
FLAG_ACTIVITY_NEW_TASK
cờ mà bạn sử dụng trong mã, hãy đặt thuộc tính này trống để đảm bảo hoạt động này không nằm trong tác vụ mặc định của ứng dụng. Bất kỳ hạng nào các công việc hiện tại có đối tượng tương đồng mặc định của ứng dụng 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 thể vô tình quay lại đó.
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à đưa ra thông báo:
-
Tạo một
Intent
để khởi độngActivity
-
Đặt
Activity
để bắt đầu trong một tác vụ mới, trống bằng cách đang gọisetFlags()
với các cờFLAG_ACTIVITY_NEW_TASK
vàFLAG_ACTIVITY_CLEAR_TASK
. -
Tạo
PendingIntent
bằng cách gọigetActivity()
Lệnh này được minh hoạ trong ví dụ sau:
Kotlin
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 )
Java
Intent notifyIntent = new Intent(this, ResultActivity.class); // Set the Activity to start in a new, empty task. notifyIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); // Create the PendingIntent. PendingIntent notifyPendingIntent = PendingIntent.getActivity( this, 0, notifyIntent, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE );
-
Tạo một
- Truyền
PendingIntent
vào thông báo như bình thường:Kotlin
val builder = NotificationCompat.Builder(this, CHANNEL_ID).apply { setContentIntent(notifyPendingIntent) ... } with(NotificationManagerCompat.from(this)) { notify(NOTIFICATION_ID, builder.build()) }
Java
NotificationCompat.Builder builder = new NotificationCompat.Builder(this, CHANNEL_ID); builder.setContentIntent(notifyPendingIntent); ... NotificationManagerCompat notificationManager = NotificationManagerCompat.from(this); notificationManager.notify(NOTIFICATION_ID, builder.build());
Để biết thêm thông tin về các tuỳ chọn tác vụ và cách ngăn xếp lui hoạt động, xem phần Tác vụ và ngăn xếp lui.