为什么我们使用 TaskStackBuilder?

Why do we use the TaskStackBuilder?

为什么我们在创建通知时使用 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);
}

假设您有一个电子邮件发送应用程序,并且其中有两个活动。一个是 MainActivity,其中包含电子邮件列表,另一个是用于显示电子邮件 (EmailViewActivity)。所以现在当你收到一封新邮件时,你会在状态栏上显示一个通知。现在您想要在用户单击该电子邮件时查看该电子邮件,并且如果用户单击后退按钮则在显示该电子邮件之后您想要显示电子邮件列表 activity(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

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

其他答案很好地解释了这一点:您使用待定意图将用户发送到详细信息 activity,然后您希望他们使用后退按钮返回到主要内容 activity .另一种设置此 is

的方法
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"

对于 AndroidManifest.xml 中的 DetailActivity

提供正确的导航。

1) When the app is launched by App icon (Normal Flow)

**

2) When the app is launched by some Notification

您应用中的一般导航流程是主要Activity->详细信息Activity

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

我该怎么做?

1) 在 Activity

中添加 android:parentActivityName="com.example.myApp.MainActivity

此功能是在 Android 4.1 中添加的。因此,如果您想针对较旧的设备。添加一个 meta-tag 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);

}

现在传递此待处理意图以创建通知。

我遇到了同样的问题,我是这样解决的:

  1. 如前所述,我添加了 android:parentActivityName=".MainActivity" 在我的 AndroidManifest 文件中。

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

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

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

我知道已经有一段时间了,但我遇到了这个问题,这一次,我的堆栈有几个层次的深度。看看这里的好答案,我当然可以推断出 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);