NavUtils.shouldUpRecreateTask не работает на JellyBean

У меня есть приложение, которое выдает уведомления, которые при выборе запускают деятельность. В соответствии с документацией по Android я могу использовать NavUtils.shouldUpRecreateTask, чтобы проверить, была ли активность запущена напрямую (то есть из уведомления) или через обычный стек активности. Однако это дает неправильный ответ. Я тестирую это на JellyBean, но использую библиотеку поддержки.

По сути, shouldUpRecreateTask всегда возвращает false, даже если действие было начато из уведомления.

Любые идеи о том, почему UpRecreateTask не может дать правильный ответ?

3 ответа

Решение

Я до сих пор не знаю, почему происходит сбой UpRecreateTask - поиск исходного кода не очень помогает. Но решение довольно простое - я просто добавляю дополнительное значение флага в Intent, которое прикреплено к уведомлению, и проверяю это в 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's 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's task, so simply
        // navigate up to the hierarchical parent activity.
    finish();
    return true;
}

Это не правильно! Когда вы начинаете с уведомления, вы должны создать стек при создании уведомления, как описано здесь: http://developer.android.com/guide/topics/ui/notifiers/notifications.html

Поэтому при создании уведомления вы должны будете сделать это:

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's task, so
    // create a new task when navigating up, with a
    // synthesized back stack.
    TaskStackBuilder.create(this)
    // Add all of this activity's parents to the back stack
            .addNextIntentWithParentStack(intent)
            // Navigate up to the closest parent
            .startActivities();
} else {
    NavUtils.navigateUpTo(this, intent);
}

Это прекрасно работает для меня.

У меня была такая же проблема, как у ОП. 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);
Другие вопросы по тегам