Android: onCreate() вызывается несколько раз (а не мной)

Сейчас я не совсем понимаю.

Мой основной класс активности создает службу, которая создает новый поток, ожидающий подключения TCP. Как только он появится, он начнет новую работу:

Intent dialogIntent = new Intent(getBaseContext(), VoIPCall.class);
dialogIntent.putExtra("inetAddress", clientSocket.getInetAddress());
dialogIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
getApplication().startActivity(dialogIntent);

После этого запускается метод onCreate() этого класса. Он создаст 2 потока: один записывает и отправляет данные, другой - принимает и воспроизводит данные. Эти потоки имеют цикл while while.

По какой-то причине я замечаю, что onCreate() этого последнего класса снова вызван, что приводит к сбою моей программы. Я не понимаю, почему он вызывается снова, поскольку работает только 2 потока, нет взаимодействия с пользователем. В документации говорится: "Вызывается, когда действие сначала создается". Активность уже запущена, и я не пытаюсь ее создать.

Может ли кто-нибудь объяснить мне это поведение?

Ответ 1

Android восстановит вашу активность после определенных "изменений конфигурации устройства". Одним из таких примеров является ориентация. Вы можете прочитать больше здесь... http://developer.android.com/guide/topics/resources/runtime-changes.html

Возможно, что-то в ваших потоках делает что-то, что считается изменением конфигурации?

Если в этом случае вам может быть полезно расширить класс приложения и выполнить свою инициализацию. Посмотреть это сообщение... Перезагрузка активности при ротации Android

НТН

Ответ 2

Я испытывал активность, называемую дважды на некоторых устройствах Samsung. Я решил добавить android: launchMode = "singleInstance" в теге Activity на манифесте. Надеюсь, это поможет.

Ответ 3

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

Ответ 4

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

Ниже приведен пример, в котором Activity_A вызывает Activity_B и передает значения в намерении для сбора в Activity_B:

Intent intent = new Intent(this, activityB.class);
intent.putExtra("val1", someValue1);
intent.putExtra("val2", someValue2);
intent.putExtra("val3", someValue3);
this.StartActivity(intent);

В этом случае вы можете установить android:launchMode="singleInstance" или android:launchModel="singleTop" в вашем AndroidManifest.xml, и Activity_B запустится только один раз. Надеюсь это поможет.