【问题标题】:Why do we use the TaskStackBuilder?为什么我们使用 TaskStackBuilder?
【发布时间】:2016-04-28 10:44:09
【问题描述】:

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

【问题讨论】:

标签: android android-notifications taskstackbuilder


【解决方案1】:

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

【讨论】:

  • 您也不必只在通知中使用 StackBuilder。如果您的应用程序很复杂,您可以创建一个 stackbuilder 并调用 pendingIntent.send();
  • 您也可以使用 stackBuilder.addNextIntentWithParentStack(targetActivity) 要求 android 自动添加目标之前的所有先前活动。为此,您的 android 清单应该正确设置 parentActivityNames。
  • 按向上应该将用户带到“电子邮件视图”部分的顶部,即留在应用程序中,而按返回应该离开应用程序,允许用户离开回到他们来自的地方(外部应用程序)。劫持后退按钮的应用程序做错了(是的,一些 Google 应用程序做错了)。
  • 注意!!!不要使用 Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK 来将其传递给 addNextIntent 函数。
  • 别忘了加android:parentActivityName=".activity.MainActivity"
【解决方案2】:

提供正确的导航。

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

**

2) 当应用被一些通知启动时

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

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

我该怎么做?

1) 在您的 Activity 中添加 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);

}

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

【讨论】:

  • 图文解说真的很可观!感谢您的解决方案!
【解决方案3】:

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

【讨论】:

    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

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

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

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

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

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

        【讨论】:

          猜你喜欢
          • 2020-11-11
          • 2011-04-02
          • 1970-01-01
          • 1970-01-01
          • 2016-05-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多