40

ここで説明する動作を実装しようとしています。通知(またはその他)がアプリの「内部」アクティビティを開始し、ユーザーが押し戻すと「ホーム」アクティビティに移動します。

Androidドキュメントによると

[戻る]ボタンの場合は、タスクのバックスタックに、アプリの最上画面への完全な上向きのナビゲーションパスを挿入することで、ナビゲーションをより予測しやすくする必要があります。これにより、アプリの入力方法を忘れたユーザーは、終了する前にアプリの最上部の画面に移動できます。

実際にそれを行う良い方法はありますか?Stackoverflowに関する他の質問では、内部アクティビティを開始するように指示する意図でメインアクティビティを開始することを提案していますが、これは大きなハックのように思われます。GoogleがGmailで使用したかどうかは疑わしいので、適切な方法があると思います。彼らがその行動を支持していること。

それで、これを行うためのハッキーでない方法はありますか?

4

10 に答える 10

81

ああ、私は単にPendingIntent.getActivities()の代わりに使用する必要がありgetActivity()ます。また、言及する価値がありますTaskStackBuilder

ここにいくつかのコードがあります:

    Intent backIntent = new Intent(ctx, MainActivity.class);
    backIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

    Intent intent = new Intent(ctx, ConversationActivity.class);
    intent.putExtra("whatever", whatever);
    final PendingIntent pendingIntent = PendingIntent.getActivities(ctx, UNIQUE_REQUEST_CODE++,
            new Intent[] {backIntent, intent}, PendingIntent.FLAG_ONE_SHOT);

ちょうどそれをテストしました。それは魅力のように機能します。最初は、アプリがすでに実行されている場合は問題があるのではないかと思ったので、通知に移動します。つまり、アクティビティスタックは(右上)です:

[MainActivity] [SomeActivity]

の通知をクリックしますConversationActivity。取得しますか:?

[MainActivity] [SomeActivity] [MainActivity] [ConversationActivity]

まあ、それはあなたが魔法のように得ることがわかります

[MainActivity] [SomeActivity] [ConversationActivity]

それが私が望んでいたことですが、それがどのように行われるのかわかりません。どのアクティビティにも特別なオプションは設定していません。しかたがない!

于 2012-12-10T12:42:00.207 に答える
8

これを行う方法に関する新しいガイドがあり、上記の回答とは少し異なる方法を提案しています。

https://developer.android.com/guide/topics/ui/notifiers/notifications.html#NotificationResponse

0のrequestCodeには実際には使用しないでくださいgetPendingIntent。私にとっては、0以外の数字は機能しましたが、0の場合、戻るボタンがランチャーに移動しました。

于 2017-07-19T04:34:12.470 に答える
4

私はこれを達成する2つの方法を知っています:

  1. home activity通知によって開始されたアクティビティ内から開始します。考えられるさまざまなエントリポイントを区別して追跡する必要があるため、これは非常に難しい場合があります。
  2. あなたは常にあなたから始めます。あなたhome activityは通知によって開始されているかどうかをチェックしてから、を開始しnotification activityます。これにより、一貫したエントリポイントが確保され、ユーザーが上キーを押したときにバックスタックが存在します。

よろしく。

于 2012-12-10T12:34:40.317 に答える
2
Intent displayIntent = new Intent(getApplicationContext(), TargetActivity.class);

displayIntent.putExtra("extra_id", "extra_key");

TaskStackBuilder stackBuilder = TaskStackBuilder.create(getApplicationContext());
stackBuilder.addParentStack(TargetActivity.class);
stackBuilder.addNextIntent(displayIntent);
stackBuilder.editIntentAt(1).putExtra("extra_id", "extra_key");

PendingIntent contentIntent = stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);

NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(
        getApplicationContext(), "123").setSmallIcon(R.drawable.logo)
        .setContentTitle("GCM Notification")
        .setStyle(new NotificationCompat.BigTextStyle().bigText("Sample")).setContentText("sample text");

mBuilder.setContentIntent(contentIntent);

NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
mNotificationManager.notify(456, mBuilder.build());
stackBuilder.startActivities();

上記のコードに加えて、ファイルに適切な親クラス名も指定しAndroidManifest.xmlます。

于 2018-11-21T08:46:43.133 に答える
1

このソリューションは、この問題に対して正確に機能します

android:noHistory="true"
于 2017-01-26T07:33:25.220 に答える
1

答えはこの公式文書にあります私にとっては完璧に機能します

https://developer.android.com/training/notify-user/navigation#DirectEntry

https://developer.android.com/training/notify-user/navigation#build_a_pendingintent_with_a_back_stack

于 2021-01-26T16:25:10.213 に答える
0

良い。

ただし、PendingIntent.getActivities()が使用できないため、3.0より前(APIレベル11より前)のシステムでは機能しないことに注意してください。

これは、通知からアクティビティにアクセスするためのバックスタックを構築し(インテントを介して)、戻るボタンをアプリケーションと一貫して動作させる場合も同じです(たとえば、詳細アクティビティはリストアクティビティに戻ります)。

于 2014-01-10T18:18:34.870 に答える
0

アクティビティは、バックスタック内のアクティビティのグループに他ならないタスクに関連付けられています。通知をクリックして新しいアクティビティを開くと、そのアクティビティは独立したアクティビティとして開かれ、新しいタスクに入れられます。これは、通知アクティビティと親アクティビティのみが存在することを意味します。

マニフェストファイルでアクティビティの起動モードを「標準」として指定するだけで、問題が解決するはずです。

Intent resultIntent = new Intent(getApplicationContext(),
                        ResultActivity.class);

PendingIntent resultPendingIntent =
    PendingIntent.getActivity(getApplicationContext(),0,resultIntent,PendingIntent.FLAG_UPDATE_CURRENT);

mBuilder.setContentIntent(resultPendingIntent); 

NotificationManager mNotificationManager = (NotificationManager)
    getSystemService(Context.NOTIFICATION_SERVICE);
mNotificationManager.notify(notId, mBuilder.build());

マニフェスト:

<activity
            android:name="com.mns.exercisenotifications.ResultActivity"
            android:label="@string/app_name"
            android:launchMode="standard" >  <---
            <intent-filter>
                <action android:name="com.mns.exercisenotifications.ResultActivity" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>

 </activity>
于 2014-07-03T09:44:28.343 に答える
0

この行をマニフェストに追加するだけです。

<activity
    android:name=".YourActivity"
    android:launchMode="singleTask"
    android:taskAffinity=""
    android:excludeFromRecents="true">
</activity>

完全なガイドラインについては、https://developer.android.com/training/notify-user/navigationを参照してください。

于 2019-03-20T20:03:40.220 に答える
0

私は遅れていることを知っていますが、これは誰かを助けるかもしれません。
通知で開きたいアクティビティのインテントを作成するだけです。次に、フラグとして設定Intent.FLAG_ACTIVITY_NEW_TASKします。 次に、あなたがする必要があるのは、あなたの意図をパラメータとして作成することです。Intent.FLAG_ACTIVITY_CLEAR_TASK
PendingIntent

これはコード例です:

Intent intent = new Intent(this, NotificationActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, 0);
于 2019-03-27T05:58:36.530 に答える