Ошибка NavUtils.shouldUpRecreateTask на JellyBean
У меня есть приложение, которое выдает уведомления, которые при выборе запускают действие. В соответствии с документами Android я могу использовать NavUtils.shouldUpRecreateTask, чтобы проверить, была ли запущена работа напрямую (т.е. Из уведомления) или через обычный стек активности. Однако это дает неправильный ответ. Я тестирую это на JellyBean, но используя библиотеку поддержки.
В принципе shouldUpRecreateTask всегда возвращает false, даже когда действие было запущено из уведомления.
Любые идеи о том, почему shouldUpRecreateTask не дает правильного ответа?
Ответы
Ответ 1
Я все еще не знаю, почему shouldUpRecreateTask не удается - просмотр исходного кода для него не очень помогает. Но решение довольно просто - я просто добавляю дополнительное значение флага в намерение, которое прикреплено к уведомлению, и проверяет его в onCreate(). Если он установлен, тогда извещения вызывается Activity, поэтому задний стоп должен быть воссоздан.
Код выглядит следующим образом:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Bundle b = getIntent().getExtras();
fromNotification = b.getInt("fromNotification") == 1;
setContentView(R.layout.threadlist);
}
@Override
public boolean onHomeButtonPressed() {
if(fromNotification) {
// This activity is not part of the application task, so create a new task
// with a synthesized back stack.
TaskStackBuilder tsb = TaskStackBuilder.from(this)
.addNextIntent(new Intent(this, COPAme.class));
tsb.startActivities();
}
// Otherwise, This activity is part of the application task, so simply
// navigate up to the hierarchical parent activity.
finish();
return true;
}
Ответ 2
Это неверно!
Когда вы начинаете с уведомления, вы должны создать стек при создании уведомления, как описано здесь: http://developer.android.com/guide/topics/ui/notifiers/notifications.html#NotificationResponse
Поэтому при создании уведомления вам нужно будет сделать это:
Intent resultIntent = new Intent(this, ResultActivity.class);
// ResultActivity is the activity you'll land on, of course
TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
// Adds the back stack
stackBuilder.addParentStack(ResultActivity.class);
// Adds the Intent to the top of the stack
// make sure that in the manifest ResultActivity has parent specified!!!
stackBuilder.addNextIntent(resultIntent);
// Gets a PendingIntent containing the entire back stack
PendingIntent resultPendingIntent =
stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);
а затем, когда вы нажимаете кнопку UP, вам нужен обычный код:
if (NavUtils.shouldUpRecreateTask(this, intent)) {
// This activity is NOT part of this app task, so
// create a new task when navigating up, with a
// synthesized back stack.
TaskStackBuilder.create(this)
// Add all of this activity parents to the back stack
.addNextIntentWithParentStack(intent)
// Navigate up to the closest parent
.startActivities();
} else {
NavUtils.navigateUpTo(this, intent);
}
Это отлично работает для меня.
Ответ 3
У меня была та же проблема, что и у OP. NavUtils.shouldUpRecreateTask всегда возвращал false. (JellyBean также)
Я использовал следующие функции для достижения той же функциональности.
case android.R.id.home:
Intent upIntent = new Intent(this,ParentActivity.class);
upIntent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
startActivity(upIntent);
finish();
return true;
"Исходное" намерение может быть выбрано таким образом вместо жесткого кодирования.
Intent upIntent = NavUtils.getParentActivityIntent(this);