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());
}
Спасибо всем, кто перенес со мной это далеко. Будем очень благодарны за любые подсказки, где я ошибся!