为什么我们使用TaskStackBuilder?

时间:2016-04-28 10:44:10

标签: 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);
}

6 个答案:

答案 0 :(得分:53)

假设您有一个发送应用程序的电子邮件,并且您有两个活动。一个是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

答案 1 :(得分:4)

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

答案 2 :(得分:1)

其他答案很好地解释了:您使用待定意图将用户发送到详细活动,然后您希望他们使用后退按钮返回主活动。另一种设置此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"

代表DetailActivity中的AndroidManifest.xml

答案 3 :(得分:1)

提供正确的导航。

  

1)通过“应用”图标(普通流)

启动应用时

enter image description here **

  

2)当应用程序通过某些通知启动时

enter image description here

应用中导航的一般流程为 MainActivity-> DetailActivity

但是有时Notification可能会直接打开DetailActivity。在这种情况下,按DetailActivity中的“后退”按钮不会导致您进入“ MainActivity”。这是预期的行为。但是,如果您想导航回MainActivity,则可以对其进行修改。

我该怎么做?

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

此功能已在Android 4.1中添加。因此,如果您要定位较早的设备。添加元标记还

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

2)使用TaskStackBuilder创建待处理的意图。

public PendingIntent getPendingIntent(Intent intent){

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

}

现在传递此挂起的意图来创建通知。

答案 4 :(得分:0)

我遇到了同样的问题,并且以这种方式解决了:

  1. 如前所述,我添加了 height: 100%在我的AndroidManifest文件中。

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

  3. 我使用TaskStackBuilder创建了一个待处理的意图:

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

答案 5 :(得分:0)

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