Как я могу знать, что OnResume идет после OnCreate? - PullRequest
14 голосов
/ 20 сентября 2011

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

Точка onCreate называется единицами, и 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
   }

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

Ответы [ 7 ]

5 голосов
/ 20 сентября 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()
               }
    }

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

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

2 голосов
/ 20 сентября 2011

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

1 голос
/ 20 сентября 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
    }
}
0 голосов
/ 16 мая 2019

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

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 !

0 голосов
/ 20 сентября 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 <<<<<<<<<");

    }

Проще всего проверить свой вопрос.

0 голосов
/ 20 сентября 2011

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

0 голосов
/ 20 сентября 2011

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

Деятельность имеет четыре основных состояния:

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

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

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

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

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

enter image description here

Существует три ключевых цикла, которые могут вас заинтересовать в мониторинге в вашей деятельности:

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

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

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

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

...