Я хочу знать, вернется ли пользователь на главный экран, если он выйдет из текущего действия.
Я хочу знать, вернется ли пользователь на главный экран, если он выйдет из текущего действия.
Ответы:
ОБНОВЛЕНИЕ (июль 2015 г.):
Поскольку getRunningTasks () устарел, из API 21 лучше следовать raukodraug ответ или Эд Бернетт один (я бы предпочел второй).
Есть возможность проверить текущие задачи и их стек с помощью ActivityManager .
Итак, чтобы определить, является ли действие последним:
Используйте следующий код:
ActivityManager mngr = (ActivityManager) getSystemService( ACTIVITY_SERVICE );
List<ActivityManager.RunningTaskInfo> taskList = mngr.getRunningTasks(10);
if(taskList.get(0).numActivities == 1 &&
taskList.get(0).topActivity.getClassName().equals(this.getClass().getName())) {
Log.i(TAG, "This is last activity in the stack");
}
Обратите внимание, что приведенный выше код будет действителен только в том случае, если у вас одна задача. Если есть вероятность, что для вашего приложения будет существовать такое количество задач - вам нужно будет проверить другие элементы taskList . Подробнее о задачах Задачи и Back Stack
isTaskRoot()
метод.
Я собираюсь опубликовать комментарий @ H9kDroid как лучший ответ здесь для людей, у которых есть аналогичный вопрос.
Вы можете использовать isTaskRoot (), чтобы узнать, является ли действие корнем задачи.
надеюсь, это поможет
if (isTaskRoot()) { // do something }
Надеюсь, это поможет новичкам. На основании приведенных выше ответов, которые мне подходят, я также делюсь фрагментом кода, поэтому его будет легко реализовать.
решение : я использовал, isTaskRoot()
который возвращает истину, если текущая активность - это только активность в вашем стеке, и кроме я также обрабатываю случай, в котором, если у меня есть какая-то активность в стеке, перейдите к последней активности в стеке вместо открытия нового пользовательской.
В вашей деятельности
@Override
public void onBackPressed() {
if(isTaskRoot()){
startActivity(new Intent(currentActivityName.this,ActivityNameYouWantToOpen.class));
// using finish() is optional, use it if you do not want to keep currentActivity in stack
finish();
}else{
super.onBackPressed();
}
}
есть самое простое решение, вы можете использовать isTaskRoot () в своей деятельности
Хотя может быть способ добиться этого (см. Другие ответы), я бы посоветовал вам не делать этого. Обычные приложения Android не должны знать, будет ли отображаться главный экран или нет.
Если вы пытаетесь сохранить данные, поместите код сохранения данных в свой метод onPause (). Если вы пытаетесь дать пользователю возможность изменить свое мнение о существующем приложении, вы можете перехватить клавиши вверх / вниз для клавиши Back и метода onBackPressed () и представить им сообщение «Вы уверены?» Подсказка.
Один из способов отслеживать это - включить маркер, когда вы начинаете новое действие, и проверить, существует ли маркер.
Каждый раз, когда вы начинаете новое занятие, вставляйте маркер:
newIntent=new Intent(this, NextOne.class);
newIntent.putExtra(this.getPackageName()+"myself", 0);
startActivity(newIntent);
И вы можете проверить это следующим образом:
boolean islast=!getIntent().hasExtra(this.getPackageName()+"myself")
Проблема с использованием решения sandrstar ActivityManager
заключается в том, что вам нужно разрешение на получение задач таким образом. Я нашел способ получше:
getIntent().hasCategory(Intent.CATEGORY_LAUNCHER)
Элемент Activity
в нижней части стека должен всегда получать эту категорию по умолчанию, в то время как другие действия не должны ее получать.
Но даже если это не удается на некоторых устройствах, вы можете установить его при запуске Activity
:
Intent intent = new Intent(startingActivity, SomeActivityClass.class);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
activity.startActivity(intent);
Я создал базовый класс для всех своих действий, расширяющий AppCompatActivity и имеющий статический счетчик:
public abstract class BasicActivity extends AppCompatActivity {
private static int activityCounter = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
++activityCounter;
...
}
@Override
public void onDestroy() {
super.onDestroy();
--activityCounter;
if(activityCounter==0) {
// Last instance code...
}
}
public boolean isLastInstance() { return (activityCounter==1); }
}
Пока это работает достаточно хорошо; и независимо от версии API. Конечно, для этого требуется, чтобы все действия расширяли этот базовый класс - что они и делают, в моем случае.
Изменить: я заметил один случай, когда счетчик опускается до нуля до полного выхода из приложения, то есть когда ориентация изменяется и открывается только одно действие. Когда ориентация изменяется, действие закрывается и создается другое, поэтому onDestroyed
вызывается для последнего действия, а затем onCreate
вызывается, когда такое же действие создается с измененной ориентацией. Это поведение необходимо учитывать; Возможно, можно использовать OrientationEventListener .
Android реализует стек Activity, я предлагаю вам прочитать об этом здесь . Похоже , все , что вы хотите сделать , хотя это получить вызывающую активность: getCallingActivity()
. Если текущее действие является первым действием в вашем приложении и приложение было запущено с домашнего экрана, оно должно (я предполагаю) вернуться null
.
Единственное, что здесь упущено, - это щелчок по клавише «Домой», когда он активирован, вы не можете обнаружить это по своим действиям, поэтому было бы лучше управлять стеком действий программно, обрабатывая нажатие клавиши «Назад» и переходя к требуемому действию или просто делаю необходимые шаги.
Кроме того, вы не можете быть уверены, что начало вашей активности из списка «Недавние действия» может быть обнаружено с помощью предварительной установки некоторых дополнительных данных в намерение для открытия активности, так как в этом случае они будут повторно использоваться.