通知からアクティビティを開始する場合は、ユーザーの ナビゲーションエクスペリエンスが 期待されるからです[戻る] ボタンをタップしたときにユーザーが元の画面に戻る必要がある アプリの通常のワークフローに沿ってホーム画面に移動し、 画面に、個別のタスクとしてアクティビティを表示する必要があります。このナビゲーションを維持するには 新しいタスクでアクティビティを開始できます。
通知のタップ動作を設定する基本的な方法については、
基本の
通知をご覧ください。
このページでは、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()
。
ただし、マニフェストで適切なタスク オプションを定義します。
-
マニフェストで、次の属性を
<activity>
要素。-
android:taskAffinity=""
-
組み合わせ
FLAG_ACTIVITY_NEW_TASK
使用する場合は、この属性を空白に設定して、 このアクティビティはアプリのデフォルト タスクには入りません。制限なし アプリのデフォルトのアフィニティを持つ既存のタスクは、 表示されます。 -
android:excludeFromRecents="true"
- 履歴画面から新しいタスクを除外して、ユーザーが 戻されないようにすることです
これを次の例に示します。
<activity android:name=".ResultActivity" android:launchMode="singleTask" android:taskAffinity="" android:excludeFromRecents="true"> </activity>
-
-
通知をビルドして発行します。
<ph type="x-smartling-placeholder">
- </ph>
-
Intent
を作成してActivity
。 -
新しい空のタスクで開始するように
Activity
を設定します。 通話中setFlags()
(フラグ:FLAG_ACTIVITY_NEW_TASK
、FLAG_ACTIVITY_CLEAR_TASK
。 -
以下を呼び出して
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 );
-
- 通常どおり
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());
さまざまなタスク オプションとバックスタックの タスクとバックスタックをご覧ください。