Как я могу узнать, что OnResume идет после onCreate?

У меня мало занятий, и из одного занятия я открываю другое, а оно возвращается к первому...

Дело в том, что onCreate называется one , а onResume каждый раз, когда отображается активность. Например, когда я закрываю B, который ранее был запущен из A, вызывается onResume, но не onCreate....

моя проблема в том, что я не хочу запускать onResume, если он приходит после onCreate, я хочу запускать код, только если onCreate не вызывался

Можно ли это сделать БЕЗ статического флага?

есть ли какой-то метод или флаг от android, например ComeAfterOnCreate?

@Override
protected void onResume() {
   if(comesAfterOnCreate){
       //DO not run this code
   }else{
      //run the long task
   }

Я показываю много ответов с решением, используя статический флаг. Спасибо всем вам за усилия и предложение помощи, но мне было интересно, есть ли какой-то метод или что-то в этом роде...


person Lukap    schedule 20.09.2011    source источник
comment
Почему бы не добавить логическое значение самостоятельно, вы можете установить его в значение true в методе onCreate, оценить в onResume и установить там значение false.   -  person nhaarman    schedule 20.09.2011
comment
пожалуйста, также покажите свой метод onCreate   -  person Ovidiu Latcu    schedule 20.09.2011
comment
вы не можете изменить порядок выполнения методов жизненного цикла. Если вы хотите, вы можете вызвать onResume в своем onCreate. сначала установите для одного логического флага значение false, затем установите для него значение true в onCreate и вызовите onResume. Выполняйте то, что хотите, если в методе onResume установлен флаг.   -  person Noby    schedule 20.09.2011
comment
Но почему ты не хочешь флаг? Это самое простое и простое решение.   -  person nhaarman    schedule 20.09.2011
comment
Потому что у меня действительно неприятная программа с большим количеством потоков, и я не хочу синхронизировать флаг, чтобы быть потокобезопасным, потому что я делаю его вялым, я не знаю, почему это так. . . Наверное, я делаю какую-то глупую ошибку в синхронизации   -  person Lukap    schedule 20.09.2011
comment
Я предполагаю, что мне придется более внимательно пересмотреть логику с потокобезопасными вещами в моей программе.   -  person Lukap    schedule 20.09.2011


Ответы (7)


это не сложная работа, вы можете использовать boolean или посмотреть здесь ориентация-изменение/7397085#7397085">Можно ли проверить, был ли onCreate вызван из-за изменения ориентации?

person Mohammed Azharuddin Shaikh    schedule 20.09.2011
comment
Это не ответ на мой вопрос, но он был в правильном направлении, спасибо :), хоть кто-то меня понимает, чего я хочу достичь - person Lukap; 20.09.2011

Попробуй это,

boolean flag = false;

public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

           flag = true;
....
}
@Override
    protected void onResume() {
        super.onResume();
              if(flag == true){
                 ..... // it has came from onCreate()
               }
               else{
                  .....// it has directly came to onResume()
               }
    }

Теперь, когда активность завершится, значение флага снова станет ложным, и onResume() будет вызываться со значением ложным.

Надеюсь, что это работает для вас.

person Lalit Poptani    schedule 20.09.2011

Итак, как в моем комментарии:

private boolean onCreateRunned = false;

@Override
public void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    onCreateRunned = true;

    //More code
}

@Override
public void onResume(){
    super.onResume();
    if(onCreateRunned){
        onCreateRunned = false; //important, or it will run only once.
        // Do your code
    }
}
person nhaarman    schedule 20.09.2011

Как показано в Activity — документация по Android.

Активность имеет по существу четыре состояния:

1. Если действие находится на переднем плане экрана (в верхней части стека), оно активно или выполняется.

2. Если действие потеряло фокус, но все еще видно (то есть новое неполноразмерное или прозрачное действие находится поверх вашего действия), оно приостанавливается. Приостановленная активность полностью жива (она поддерживает всю информацию о состоянии и участниках и остается привязанной к оконному менеджеру), но может быть уничтожена системой в ситуациях с крайне нехваткой памяти.

3. Если действие полностью перекрывается другим действием, оно останавливается. Он по-прежнему сохраняет всю информацию о состоянии и членах, однако он больше не виден пользователю, поэтому его окно скрыто, и система часто уничтожает его, когда память требуется в другом месте.

4. Если действие приостановлено или остановлено, система может удалить это действие из памяти, попросив его завершить или просто уничтожив его процесс. Когда он снова отображается пользователю, его необходимо полностью перезапустить и восстановить в прежнее состояние.

Вот жизненный цикл действия, как показано в документации Android:

введите здесь описание изображения

Есть три ключевых цикла, которые вам может быть интересно отслеживать в своей деятельности:

1. Весь жизненный цикл действия происходит между первым вызовом onCreate(Bundle) и последним вызовом onDestroy(). Активность выполнит всю настройку «глобального» состояния в onCreate() и освободит все оставшиеся ресурсы в onDestroy(). Например, если в фоновом режиме выполняется поток для загрузки данных из сети, он может создать этот поток в onCreate(), а затем остановить поток в onDestroy().

2. Видимое время жизни действия происходит между вызовом onStart() и до соответствующего вызова onStop(). В это время пользователь может видеть действие на экране, хотя оно может быть не на переднем плане и не взаимодействовать с пользователем. Между этими двумя методами вы можете поддерживать ресурсы, необходимые для отображения активности пользователю. Например, вы можете зарегистрировать BroadcastReceiver в onStart() для отслеживания изменений, влияющих на ваш пользовательский интерфейс, и отменить его регистрацию в onStop(), когда пользователь больше не видит то, что вы отображаете. Методы onStart() и onStop() можно вызывать несколько раз, так как активность становится видимой и скрытой для пользователя.

3. Время жизни активности переднего плана происходит между вызовом onResume() и до соответствующего вызова onPause(). В это время активность опережает все остальные активности и взаимодействует с пользователем. Активность может часто переходить между состояниями возобновления и паузы — например, когда устройство переходит в спящий режим, когда доставляется результат действия, когда доставляется новое намерение — поэтому код в этих методах должен быть довольно легким.

Вывод. Нельзя изменить порядок выполнения жизненного цикла.

person rogcg    schedule 20.09.2011
comment
Вывод: вопрос был не в этом. - person nhaarman; 20.09.2011
comment
Но нужно знать жизненный цикл Activity, чтобы знать, что погода сначала вызовет onCreate() или вызовет onResume(). @rogcg Хорошее объяснение. Голосуйте от меня. - person Dharmendra; 26.09.2011
comment
Эта диаграмма была бы бесконечно более ценной, если бы она содержала метки, которые приложение работает в фоновом режиме, и приложение снова открывается после того, как оно было в фоновом режиме. - person Carol; 19.03.2012

Попробуйте включить всплывающие уведомления в OnCreate и OnResume и проверьте, появляется ли всплывающее уведомление onResume при запуске приложения перед всплывающим уведомлением OnCreate. Или распечатайте сообщение журнала из соответствующих методов

person SamSPICA    schedule 20.09.2011

Я считаю, что @suri права. но если хотите быть более понятным с onCreate() и onResume()

тогда поставь

public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

          System.out.println(">>>>>> This is oncreate method");
....
}

@Override
    protected void onResume() {
        super.onResume();

               System.out.println("This is onResume method <<<<<<<<<");

    }

Это проще всего проверить ваш вопрос.

person Siten    schedule 20.09.2011

Это может помочь другим новичкам:

private boolean isOnCreateCalled = false;

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
         Log.i("MyTag" , "onCreate called");
         isOnCreateCalled = true;
    }
}

@Override
protected void onResume() {
    super.onResume();
    Log.i("MyTag" , "onResume called");
    if (isOnCreateCalled) {
        isOnCreateCalled = false;
        Log.i("MyTag" , "onResume's condition called once");
        // Your codes here...
    }
}

Посмотрите результат в Logcat!

person Hadi Note    schedule 16.05.2019