Я хочу знати, чи повернеться він на головний екран, якщо він вийде з поточної активності.
Я хочу знати, чи повернеться він на головний екран, якщо він вийде з поточної активності.
Відповіді:
ОНОВЛЕННЯ (липень 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");
}
Зверніть увагу, що зазначений вище код буде дійсним лише у випадку, якщо у вас є одне завдання. Якщо існує можливість, що для вашої програми буде кількість завдань - Вам потрібно буде перевірити інші елементи списку завдань . Детальніше про завдання Завдання та зворотний стек
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 (). Якщо ви намагаєтесь дати можливість користувачеві змінити свою думку щодо наявної програми, ви можете перехопити клавішу "Вгору / Вниз" для клавіші "Назад" та метод "onBackPress ()" та подати їм "Ви впевнені?" підказка.
Один із способів відстежити це - включити маркер, коли ви починаєте нову діяльність і перевіряєте, чи маркер існує.
Щоразу, коли ви починаєте нову діяльність, вставляйте маркер:
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
викликається, коли створюється однакова діяльність зі зміненою орієнтацією. Цю поведінку необхідно враховувати; ОрієнтаціяEventListener може бути використана.
Android реалізує стек "Діяльність", пропоную прочитати про це тут . Схоже , все , що ви хочете зробити , хоча це отримати викликає активність: getCallingActivity()
. Якщо поточна активність - це перша активність у вашій програмі, а програма запущена з головного екрану, вона повинна (я припускаю) повернутися null
.
Одне, що тут пропустили, - це натискання клавіші «Домашня клавіша», коли активовано, ви не можете виявити це у своїй діяльності, тому краще керувати стеком активності програмно керуючи натисканням кнопки «Назад» та переходом до потрібної діяльності або просто роблячи необхідні кроки.
Крім того, ви не можете бути впевнені, що починаючи свою діяльність зі списку "Недавня активність", можна виявити, встановивши додаткові дані в намірі відкрити активність, оскільки вони повторно використовуються в цьому випадку.