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 запустится только один раз. Надеюсь это поможет.