Кнопка "Вверх" не работает, если действие расширяет AppCompatActivity
Я запустил Activity B через глубокую ссылку, и я ожидаю, что Activity A будет запущен при нажатии кнопки Up.
Вот мой манифест
<activity
android:name=".ui.activity.B"
android:label="@string/title_activity_search"
android:parentActivityName=".ui.activity.A" >
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value=".ui.activity.A"/>
...
<!-- deep link -->
...
</activity>
B Код активности здесь.
public class B extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Toolbar vToolbar = ((Toolbar) findViewById(R.id.toolbar));
setSupportActionBar(vToolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setDisplayShowHomeEnabled(true);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
// Respond to the action bar's Up/Home button
case android.R.id.home:
NavUtils.navigateUpFromSameTask(this);
return true;
}
return super.onOptionsItemSelected(item);
}
}
Вы можете скопировать / пропустить этот код, и он работает, если действие B расширяет FragmentActivity. Но мне нужно, чтобы это работало с AppCompatActivity. Что я делаю неправильно?
1 ответ
Вы открываете свой Activity
из другого приложения. Так что нет другого Activity
доступно в стеке. Таким образом, вы не должны получить родитель Activity
чтобы подняться вперед, когда вы нажимаете кнопку вверх. Если целевое родительское действие находится в заднем стеке задачи, оно переносится вперед. Из документации разработчиков.
Однако, используя
navigateUpFromSameTask()
подходит только тогда, когда ваше приложение является владельцем текущей задачи (то есть пользователь начал эту задачу из вашего приложения). Если это не так, и ваша деятельность была начата в задаче, которая принадлежит другому приложению, то при навигации вверх должно появиться новое задание, которое принадлежит вашему приложению, что требует создания нового резервного стека.
Так что в вашем случае вам нужно сделать что-то подобное, изложенное в документации.
Если в вашем действии предусмотрены какие-либо фильтры намерений, позволяющие другим приложениям запускать действие, вам следует реализовать
onOptionsItemSelected()
обратный вызов такой, что, если пользователь нажимает кнопку "Вверх" после ввода вашей активности из задачи другого приложения, ваше приложение запускает новую задачу с соответствующим задним стеком перед переходом вверх.Вы можете сделать это, сначала позвонив
shouldUpRecreateTask()
проверить, существует ли текущий экземпляр действия в задаче другого приложения. Если он возвращает true, тогда создайте новую задачу сTaskStackBuilder
, В противном случае вы можете использоватьnavigateUpFromSameTask()
метод, как показано выше.
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
// Respond to the action bar's Up/Home button
case android.R.id.home:
Intent upIntent = NavUtils.getParentActivityIntent(this);
if (NavUtils.shouldUpRecreateTask(this, upIntent)) {
// 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(upIntent)
// Navigate up to the closest parent
.startActivities();
} else {
// This activity is part of this app's task, so simply
// navigate up to the logical parent activity.
NavUtils.navigateUpTo(this, upIntent);
}
return true;
}
return super.onOptionsItemSelected(item);
}