Bắt đầu một hoạt động trên thông báo

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.

  1. 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>
    
  2. Tạo và đưa ra thông báo:
    1. Tạo một Intent để khởi động Activity
    2. Đặt Activity để bắt đầu trong một tác vụ mới, trống bằng cách đang gọi setFlags() với các cờ FLAG_ACTIVITY_NEW_TASKFLAG_ACTIVITY_CLEAR_TASK.
    3. Tạo PendingIntent bằng cách gọi getActivity()

    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
    );
    
  3. 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.