通知からアクティビティを起動する

通知からアクティビティを開始する場合は、ユーザーの ナビゲーションエクスペリエンスが 期待されるからです[戻る] ボタンをタップしたときにユーザーが元の画面に戻る必要がある アプリの通常のワークフローに沿ってホーム画面に移動し、 画面に、個別のタスクとしてアクティビティを表示する必要があります。このナビゲーションを維持するには 新しいタスクでアクティビティを開始できます。

通知のタップ動作を設定する基本的な方法については、 基本の 通知をご覧ください。 このページでは、Google Chat で PendingIntent: 新しいタスクが作成されてから スタックしています。方法 開始するアクティビティの種類によって異なります。

通常のアクティビティ
これは、アプリの通常のユーザー エクスペリエンス フローの一部として存在するアクティビティです。日時 通知からアクティビティに到着した場合、新しいタスクは バックスタック全体を含め、ユーザーが [戻る] ボタンをタップして移動できるようにする
特別なアクティビティ
これは、通知から起動された場合に限りユーザーに表示されるアクティビティです。新しい このアクティビティは、通知 UI を拡張するために、 通知自体に表示することは困難です。このアクティビティでは、 バックスタックです。

標準アクティビティの PendingIntent をセットアップする

通知から通常のアクティビティを開始するには、PendingIntent を設定してください TaskStackBuilder を使用 以下のように新しいバックスタックが作成されます。

アプリのアクティビティ階層を定義する

以下を追加して、アクティビティの自然な階層を定義します。 android:parentActivityName<activity> 属性に 要素を追加する必要があります。次の例をご覧ください。

<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>

バックスタックを備えた PendingIntent を作成する

アクティビティのバックスタックを含むアクティビティを開始するには、 TaskStackBuilder のインスタンスと addNextIntentWithParentStack(), その変数の Intent を渡します。 アクティビティを選択します。

説明のとおりに各アクティビティの親アクティビティを定義する必要があります。 呼び出すこともできます。 getPendingIntent() バックスタック全体を含む PendingIntent を受け取ります。

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

必要に応じて、Intent TaskStackBuilder.editIntentAt()。 これは、バックスタック内のアクティビティが確実に ユーザーがそのページに移動すると、意味のあるデータを表示します。

その後、通常どおり PendingIntent を通知に渡すことができます。

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());

特殊アクティビティの PendingIntent をセットアップする

通知から開始される特別なアクティビティは戻る必要がないため PendingIntent を作成するには、 getActivity()。 ただし、マニフェストで適切なタスク オプションを定義します。

  1. マニフェストで、次の属性を <activity> 要素。
    android:taskAffinity=""
    組み合わせ FLAG_ACTIVITY_NEW_TASK 使用する場合は、この属性を空白に設定して、 このアクティビティはアプリのデフォルト タスクには入りません。制限なし アプリのデフォルトのアフィニティを持つ既存のタスクは、 表示されます。
    android:excludeFromRecents="true"
    履歴画面から新しいタスクを除外して、ユーザーが 戻されないようにすることです

    これを次の例に示します。

    <activity
        android:name=".ResultActivity"
        android:launchMode="singleTask"
        android:taskAffinity=""
        android:excludeFromRecents="true">
    </activity>
    
  2. 通知をビルドして発行します。 <ph type="x-smartling-placeholder">
      </ph>
    1. Intent を作成して Activity
    2. 新しい空のタスクで開始するように Activity を設定します。 通話中 setFlags() (フラグ: FLAG_ACTIVITY_NEW_TASKFLAG_ACTIVITY_CLEAR_TASK
    3. 以下を呼び出して PendingIntent を作成します。 getActivity()

    これを次の例に示します。

    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. 通常どおり PendingIntent を通知に渡します。

    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());
    

さまざまなタスク オプションとバックスタックの タスクとバックスタックをご覧ください。