为什么我们使用TaskStackBuilder?

Mis*_*ere 29 android android-notifications 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);
}
Run Code Online (Sandbox Code Playgroud)

小智 58

假设您有一个电子邮件发送应用程序,并且您有两个活动.一个是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);
    }
Run Code Online (Sandbox Code Playgroud)

希望你能理解.

请按照以下网址获取更多详细信息: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

  • 您也可以使用 stackBuilder.addNextIntentWithParentStack(targetActivity) 要求 android 自动添加目标之前的所有先前活动。为此,您的 android manifest 应该正确设置 parentActivityNames。 (2认同)
  • 注意 !!!不要使用`Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK` 的目的是将其传递给 addNextIntent 函数。 (2认同)

Roh*_*ngh 25

提供适当的导航。

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>
Run Code Online (Sandbox Code Playgroud)

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

}
Run Code Online (Sandbox Code Playgroud)

现在传递这个 Pending 意图来创建通知。

  • 图解的解释真是太棒了!谢谢您的解决方案! (6认同)

Den*_*nis 5

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