Почему мы используем 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);
}

Ответы

Ответ 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

Ответ 2

Мы используем TaskStackBuilder, чтобы убедиться, что кнопка назад будет играть хорошо, когда начнется действие. TaskStackBuilder позволяет получить доступ к истории действий, используемых кнопкой "Назад" . В основном мы используем его, когда хотим, чтобы пользователь перешел к другому действию после нажатия кнопки возврата.

Ответ 3

Другие ответы объяснили это хорошо: вы используете ожидающее намерение отправить пользователя в подробное действие, затем вы хотите, чтобы они использовали кнопку "Назад", чтобы вернуться к основному действию. Альтернативный способ установить это является

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.

Ответ 4

Для обеспечения правильной навигации.

1) Когда приложение запускается значком приложения (Normal Flow)

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

}

Теперь передайте это ожидающее намерение для создания уведомлений.