TaskStackBuilder выходит из приложения при нажатии кнопки "Назад" в Android

У меня возникли проблемы с получением TaskStackBuilder для правильной работы.

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

Я прочитал соответствующие документы для разработчиков и подумал, что следовал им и провел дополнительные исследования здесь и в других местах, но (очевидно) я, должно быть, что-то пропустил или неправильно понял. Буду признателен за любые рекомендации, которые кто-либо может предложить.

Чтобы помочь себе научиться программированию на Android, я работаю над простой программой, которая отслеживает и отображает маршрут бега или ходьбы пользователя. Точкой входа для программы является Activity, в которой размещается один ListFragment, отображающий прогоны пользователя и представляющий меню параметров, позволяющее создать новый прогон.
Нажатие на элемент списка или выбор пункта меню "Параметры" запускает второе действие, в котором размещается один фрагмент, отображающий сведения о конкретном прогоне. С этого фрагмента пользователь может начать отслеживать этот прогон. Когда начинается отслеживание, приложение запускает уведомление о том, что отслеживание продолжается. Нажатие на уведомление возвращает пользователя во фрагмент для отслеживаемого прогона.

Когда пользователь переходит от исходного ListFragment к RunFragment, кнопка "Домой" и клавиша "Назад" работают, как и ожидалось, - пользователь возвращается к домашнему ListFragment.
Однако, когда пользователь попадает в RunFragment, щелкая уведомление, нажатие кнопки "Домой" или кнопки "Назад" полностью закрывает приложение.
Я пытался настроить синтетический задний стек для решения этой проблемы с помощью TaskStackBuilder, но безуспешно.

Вот соответствующий код:

Выдержка из AndroidManifest.xml:

<activity
        android:name=".RunListActivity"
        android:label="@string/app_name" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity android:name=".RunActivity"
              android:label="@string/app_name"
              android:parentActivityName=".RunListActivity">
        <meta-data android:name="android.support.PARENT_ACTIVITY"
                   android:value=".RunListActivity"/>
    </activity>

Ниже приводятся выдержки из RunFragment.java, класса, который реализует отображение подробностей отдельного прогона и к которому приводит пользователь при нажатии на уведомление.

Первый, onCreate():

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setRetainInstance(true);
    if (NavUtils.getParentActivityName(getActivity()) != null) {
        getActivity().getActionBar().setDisplayHomeAsUpEnabled(true);
    }
    setHasOptionsMenu(true);
    ...
}

Следующий, onOptionItemSelected():

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case android.R.id.home:
            Intent runListActivityIntent = NavUtils.getParentActivityIntent(getActivity());
            if (NavUtils.shouldUpRecreateTask(getActivity(), runListActivityIntent)) {

                TaskStackBuilder.create(getActivity())
                        .addNextIntentWithParentStack(runListActivityIntent)
                        .startActivities();
                return true;
            }
            if (NavUtils.getParentActivityName(getActivity()) != null) {

                NavUtils.navigateUpFromSameTask(getActivity());
                return true;
            }
        default:
            return super.onOptionsItemSelected(item);
    }
}

Наконец, код, создающий уведомление и настраивающий TaskStackBuilder, в котором, без сомнения, и заключается проблема:

private void createNotification() {
    Notification.Builder mBuilder =
            new Notification.Builder(getActivity())
            .setSmallIcon(android.R.drawable.ic_menu_report_image)
            .setContentTitle(getString(R.string.notification_title))
            .setContentText(getString(R.string.notification_text));

    //Create an explicit Intent for RunActivity with an Extra to
    //select the run that's being monitored
    Intent runActivityIntent = new Intent(getActivity(), RunActivity.class);
    runActivityIntent.putExtra(RunActivity.EXTRA_RUN_ID, mRun.getId());
    //The stack builder object should create an artificial back stack for
    //RunActivity so that when navigating back from the RunFragment we're
    // viewing we'll go to the RunListFragment instead of the Home screen
    TaskStackBuilder stackBuilder = TaskStackBuilder.create(getActivity());

    stackBuilder.addNextIntentWithParentStack(runActivityIntent);

    PendingIntent resultPendingIntent =
            stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);
    mBuilder.setContentIntent(resultPendingIntent);
    mNotificationManager.notify(0, mBuilder.build());
}

Спасибо всем, кто перенес со мной это далеко. Будем очень благодарны за любые подсказки, где я ошибся!

0 ответов

Другие вопросы по тегам