Как избежать вызова onCreate () при запуске Activity? - PullRequest
4 голосов
/ 02 августа 2011

Я хочу перезагрузить активность из стека.

Я использую startActivity(), чтобы начать новые действия.Когда я в Упражнение D Я хочу перезагрузить Упражнение A и не начинать новое намерение.Я не могу использовать startActivity() при вызове A из D , потому что он вызовет onCreate(), который запускает поток для получения некоторых данных.

РЕДАКТИРОВАТЬ : обновлен стек.

Если я использую FLAG_ACTIVITY_REORDER_TO_FRONT, он снова вызывает метод onCreate().

Вот мой сценарий.

Login Activity ̣→ Activity A → Activity B → Activity C → Activity D → Activity A

Как мне избежать вызова onCreate()?

Ответы [ 5 ]

5 голосов
/ 03 августа 2011

Вы должны использовать совершенно другой подход. Не имеет значения, начинаете ли вы свою деятельность с startActivity() или startActivityForResult(), потому что onCreate(), onStart() и onResume() будут вызваны при запуске действия.

Теперь, если у вас есть метод в вашем классе Activity, который запускает другой поток для выполнения какой-то работы, тогда вы должны работать с флагами. Если ваша активность требует автоматического запуска потока при первом выполнении, вы должны обернуть его вокруг предложения if, чтобы проверить флаг, установленный при первом запуске.

Идея состоит в том, чтобы ваша активность установила логическое значение true в вашем экземпляре Application или SharedPreferences при первом запуске потока. Когда вы возвращаетесь к этому действию и не хотите, чтобы этот поток запускался автоматически из-за вызова onCreate(), вы должны обернуть свой вызывающий код вокруг некоторого предложения if, как в примере ниже.

Вот пример.

@Override
public void onCreate(Bundle bundle) {
    super.onCreate(bundle);
    // Other stuff

    if (!YourApplicationInstance.wasCalled) {
        // Run your thread or do something else you want to do only once.

        // Set the wasCalled flag to true to not run this code again
        // if onCreate() is called a second time.
        YourApplicationInstance.wasCalled = true;
    }
}

Вам придется читать Использовать контекст приложения везде? , чтобы понять, как реализовать мой псевдокласс YourApplicationInstance.

2 голосов
/ 02 августа 2011

есть тег с именем launchMode для активности в манифесте. Оформить заказ ссылка . и это не вызовет onCreate, но вызовет onNewIntent, где вы можете повторно инициализировать ваши вещи.

2 голосов
/ 02 августа 2011

следующее не соответствует действительности. startActivityForResult () и startActivity () отличаются только целью возврата вызываемой операции

попробуйте использовать startActivityForResult () вместо startActivity (). Я считаю, что это не полностью завершает деятельность и начинает ее снова. я рекомендовал бы использовать эту ссылку для дальнейшего чтения о том, как реализовать такой метод.

Так что пункт 2 @Kgrover тоже не выполняется.

Флаг Intent http://developer.android.com/reference/android/content/Intent.html#FLAG_ACTIVITY_REORDER_TO_FRONT делает именно это.

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

Это эквивалентно решению Сэма Квеста, с той лишь разницей, что если вы установите launchMode, поведение вашей деятельности в стеке будет жестко закодировано, т.е. ваша активность А всегда будет в режиме singleTask.

0 голосов
/ 05 января 2017
@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case android.R.id.home:
            this.finish();
            return true; 
    }
    return super.onOptionsItemSelected(item);
}

Это убьет активность ребенка. Таким образом, родительская активность не воссоздана

0 голосов
/ 02 августа 2011

1) Хотя я не уверен, вы можете попробовать использовать startActivityForResult () вместо startActivity ().Я считаю, что это не полностью завершает деятельность и начинает ее снова.Я бы рекомендовал использовать эту ссылку для дальнейшего чтения о том, как реализовать такой метод.

2) В качестве альтернативы, когда вы переходите от действия D -> A, продолжайте использовать startActivity (), но передайте пустышку.Затем в упражнении A используйте оператор if:

 if(!(this.getIntent().hasExtra("dummyStringExtra")) {
  //fire the data thread here 
}

Cheers.Надеюсь, это поможет.

...