45

为什么我们TaskStackBuilder在创建通知时使用?我不明白它背后的逻辑。

有人可以解释一下。

public void showText(final String text){
    Intent intent = new Intent (this, MainActivity.class);
    TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
    stackBuilder.addParentStack(MainActivity.class);
    stackBuilder.addNextIntent(intent);
    PendingIntent pendingIntent = stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);
    Notification notification = new Notification.Builder(this)
            .setSmallIcon(R.mipmap.ic_launcher)
            .setContentTitle(getString(R.string.app_name))
            .setAutoCancel(true)
            .setPriority(Notification.PRIORITY_MAX)
            .setDefaults(Notification.DEFAULT_VIBRATE)
            .setContentIntent(pendingIntent)
            .setContentText(text)
            .build();
    NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
    notificationManager.notify(NOTIFICACTION_ID, notification);
}
4

6 回答 6

87

假设您有一个电子邮件发送应用程序,并且其中有两个活动。一种是MainActivity有电子邮件列表的,另一种是用于显示电子邮件的(EmailViewActivity)。因此,现在当您收到新电子邮件时,您会在状态栏上显示通知。现在,您希望在用户单击该电子邮件时查看该电子邮件,并且在用户单击返回按钮后显示该电子邮件后,您希望显示电子邮件列表活动(MainActivity)。对于这种情况,我们可以使用TaskStackBuilder. 请参见下面的示例:

public void showEmail(final String text){

        Intent intent = new Intent (this, MainActivity.class);
        TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
        stackBuilder.addParentStack(MainActivity.class);
        stackBuilder.addNextIntent(intent);
        Intent intentEmailView = new Intent (this, EmailViewActivity.class);
        intentEmailView.putExtra("EmailId","you can Pass emailId here");
        stackBuilder.addNextIntent(intentEmailView);
        PendingIntent pendingIntent = stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);
        Notification notification = new Notification.Builder(this)
                .setSmallIcon(R.mipmap.ic_launcher)
                .setContentTitle(getString(R.string.app_name))
                .setAutoCancel(true)
                .setPriority(Notification.PRIORITY_MAX)
                .setDefaults(Notification.DEFAULT_VIBRATE)
                .setContentIntent(pendingIntent)
                .setContentText(text)
                .build();
        NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
        notificationManager.notify(NOTIFICACTION_ID, notification);
    }

希望你能理解。

按照以下网址了解更多详情: http: //developer.android.com/reference/android/support/v4/app/TaskStackBuilder.html http://developer.android.com/guide/components/tasks-and-back- stack.html http://www.programcreek.com/java-api-examples/index.php?api=android.app.TaskStackBuilder

于 2016-04-28T11:34:44.527 回答
28

提供正确的导航。

1) 应用程序图标启动时(正常流程)

在此处输入图像描述 **

2)当应用程序由一些通知启动时

在此处输入图像描述

您的应用程序中的一般导航流程是 MainActivity->DetailActivity

但有时一个Notification可能会直接打开DetailActivity. 在这种情况下,按下后退按钮DetailActivity不会将您带到`MainActivity。这是一种预期的行为。但是,如果您想导航回 MainActivity,您可以修改它。

我该怎么做?

1)在您的活动中添加 android:parentActivityName="com.example.myApp.MainActivity

此功能是在 Android 4.1 中添加的。因此,如果您想针对较旧的设备。添加一个元标记 ALSO

<activity android:name=".Activities.DetailActivity"
    android:parentActivityName=".Activities.MainActivity">
    <meta-data
      android:name="android.support.PARENT_ACTIVITY"
      android:value=".Activities.MainActivity" />
</activity>

2) 使用TaskStackBuilder 创建一个Pending Intent。

public PendingIntent getPendingIntent(Intent intent){

    TaskStackBuilder taskStackBuilder = TaskStackBuilder.create(this);
    taskStackBuilder.addNextIntentWithParentStack(intent);
    PendingIntent pendingIntent = taskStackBuilder.getPendingIntent(0,PendingIntent.FLAG_UPDATE_CURRENT);

}

现在传递这个待处理的意图来创建通知。

于 2019-03-25T10:30:41.963 回答
4

我们使用 aTaskStackBuilder来确保在活动开始时后退按钮能够正常播放。TaskStackBuilder允许您访问后退按钮使用的活动历史记录。基本上,当我们希望用户在按下后退按钮后导航到另一个活动时,我们会使用它。

于 2017-07-16T14:15:06.803 回答
2

我知道已经有一段时间了,但我遇到了这个问题,这一次,我的堆栈有几个层次的深度。看看这里的好答案,我当然能够推断出 3 个或更多级别。因为它看起来很直接,所以一开始对我来说并不是这样,因为我将后面的堆栈翻了三倍。希望它可以帮助某人。确保Manifest.xml正确设置

无论如何,对于具有多个级别的人来说,这很好用:

    Intent level3Intent = new Intent(this, Level3.class);
    level3Intent.putExtra(YOUR STUFF);

    Intent level2Intent = new Intent(this, Level2.class);
    //level2Intent.putExtra(YOUR STUFF);

    Intent level1Intent = new Intent(this, MainActivity.class);

    // Get the PendingIntent containing the entire back stack with the needed extras
    PendingIntent pendingIntent =
            TaskStackBuilder.create(this)
                    .addParentStack(MainActivity.class)
                    .addNextIntent(level1Intent)
                    .addNextIntent(level2Intent)
                    .addNextIntent(level3Intent)
                    .getPendingIntent(requestCode, PendingIntent.FLAG_UPDATE_CURRENT);

return new NotificationCompat.Builder(getApplicationContext(), CHANNEL_ID)
            .setContentTitle(notification_title)
            .setContentText(notification_msg)
            .setStyle(new NotificationCompat.BigTextStyle()
             .bigText(notification_msg))
            .setSmallIcon(R.drawable.ic_sea)
            .setDefaults(Notification.DEFAULT_SOUND)
            .setWhen(System.currentTimeMillis())
            .setGroup(OWS_GROUP)
            .setAutoCancel(true)
            .setContentIntent(pendingIntent);
于 2020-03-23T18:44:53.533 回答
1

其他答案很好地解释了这一点:您使用未决意图将用户发送到详细活动,然后您希望他们使用后退按钮返回主要活动。另一种设置方法

Intent detailIntentForToday = new Intent(context, DetailActivity.class);
TaskStackBuilder taskStackBuilder = TaskStackBuilder.create(context);
taskStackBuilder.addNextIntentWithParentStack(detailIntentForToday);
PendingIntent resultPendingIntent = taskStackBuilder
    .getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);
resultPendingIntent.send();

为此,您还需要设置

android:parentActivityName=".MainActivity"

对于DetailActivityAndroidManifest.xml.

于 2018-01-29T13:50:25.950 回答
0

我有同样的问题,我以这种方式解决了:

  1. 正如已经建议的那样,我 android:parentActivityName=".MainActivity"在我的 AndroidManifest 文件中添加了。

  2. 我还在每个类中添加了onResume方法

  3. 我使用 TaskStackBuilder 创建了一个 Pending Intent:

    Intent intent = new Intent(context, myClass); TaskStackBuilder taskStackBuilder = TaskStackBuilder.create(context); taskStackBuilder.addNextIntentWithParentStack(intent); PendingIntent pendingIntent = taskStackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);

于 2019-12-17T10:30:32.813 回答