Android возвращается к первому действию при нажатии кнопки
Я пишу приложение, в котором я имею дело с 4-мя действиями, скажем, A, B, C и D. Активность A вызывает B, B вызывает C, C вызывает D. На каждую из операций у меня есть кнопка, называемая "Главная кнопка. Когда пользователь нажимает кнопку" домой" в любой из операций B, C, D, приложение должно вернуться к экрану активности?
Как имитировать "домашнюю" кнопку в этом случае?
Ответы
Ответ 1
button.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
startActivity(new Intent(D.this, A.class));
}
});
Объявите A в своем манифесте с помощью android:launchMode="singleTask"
. Таким образом, когда вы вызываете startActivity()
из других ваших действий, а A уже работает, он просто выводит его на передний план. В противном случае он запустит новый экземпляр.
Ответ 2
Единственная проблема, с которой я вижу использование android:launchMode="singleTask"
, - это когда вы сворачиваете приложение и запускаете приложение, снова нажав значок приложения, а затем начните с нуля и не получите его состояние. поэтому я решил использовать
intent.setFlags( Intent.FLAG_ACTIVITY_CLEAR_TOP );
который сохранит только один экземпляр и очистит все действия поверх этого.
Intent intent = new Intent( context, MyActivity.class );
intent.setFlags( Intent.FLAG_ACTIVITY_CLEAR_TOP );
current_activity.startActivity( intent );
Ответ 3
Это работает для меня
Intent intent = new Intent(D.this, A.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
В манифесте:
android:name=".A"
android:launchMode="singleTask"
Ответ 4
Я использую https://github.com/greenrobot/EventBus для этого. В корневой активности вы должны подписаться на событие
. EventBus.getDefault() регистр (это);
Затем вы должны определить обратный вызов события
public void onEvent(LogoutEvent event) {
// your implementation
logout();
}
и слушатель кнопки выхода из системы должен иметь такой код:
finish(); // you must finish previous activity
EventBus.getDefault().post(new LogoutEvent());
Что все
Ответ 5
Прежде всего, я не могу поверить, что у Android нет простого эквивалента iOS poptorootviewcontroller.
Проблема с использованием намерения и startactivity заключается в том, что, насколько я знаю, он воссоздает корневую активность, которая является проблемой, если, например, она использует асинхронный сетевой запрос для загрузки данных и компоновки интерфейса. Это может иметь неприятные визуальные эффекты.
Вот творческое решение, которое я использовал в моем проекте friendfolder:
Создать глобальное логическое значение: public boolean myBool = true;
Сделайте это в классе MyApplication и зарегистрируйте класс в манифесте:
<application
android:name=".MyApplication"
Активность A - это корень, сделайте это в onResume:
if(((MyApplication) this.getApplication()).myBool == false) {
if(isTaskRoot()) {
((MyApplication) this.getApplication()).myBool = true;
} else {
finish();
}
}
В каждом действии, которое будет включено в действие A, введите этот код в:
@Override
public void onResume() {
super.onResume();
if(((MyApplication) this.getApplication()).myBool == false) {
finish();
}
}
@Override
public boolean onSupportNavigateUp(){
((MyApplication) this.getApplication()).myBool = false;
finish();
return true;
}
Вы даже можете поместить это в действие A, если вы укладываете другие экземпляры A поверх корня A. onSupportNavigateUp для кнопки вверх. Подставьте этот метод для другого, если вы используете свою собственную кнопку.
Теперь, когда у вас есть некоторые действия, уложенные поверх A, и вы нажимаете кнопку "вверх", верхняя активность будет завершена, и система onresume будет вызываться системой в действии ниже в стеке, и она будет завершена. Это будет работать в цепочке вплоть до корня A.
Ответ 6
Kotlin
fun Context.popToRoot()
{
val intent = Intent(this, MainActivity::class.java)
intent.flags = Intent.FLAG_ACTIVITY_CLEAR_TOP
startActivity(intent)
}
Измените MainActivity на основную активность.
В любой активности просто вызывается:
this.popToRoot()