Android – потеря области действия элементов пользовательского интерфейса после onDestroy()

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

В работающем приложении вызывается onDestroy(), за которым сразу же следует onCreate(), и приложение снова запускается в обычном режиме. Однако последующие вызовы для обновления элементов пользовательского интерфейса (во вновь созданном основном действии) теперь не действуют, и похоже, что я потерял область своего макета.

    RelativeLayout splash = (RelativeLayout) findViewById(R.id.splash);
    splash.setVisibility(View.VISIBLE);

Что может происходить onDestroy(), что я не учитываю? Я не делаю много очистки на Destroy, потому что я не думал, что мне это нужно.


person TomBomb    schedule 21.02.2012    source источник
comment
У меня такая же проблема. Вы решили это?   -  person takluiper    schedule 12.04.2017


Ответы (2)


Activity был отсоединен от пользовательского интерфейса к моменту вызова onDestroy(), поэтому вызовы пользовательского интерфейса к нему не имеют никакого смысла. Если вам нужно, чтобы заставка отображалась, установите для нее значение View.VISIBLE в onCreate(), onResume() или возможно onPause(). Я не совсем уверен, что onPause() поступил бы иначе.

person DeeV    schedule 21.02.2012
comment
Извините, вызовы пользовательского интерфейса, о которых я говорю, происходят в новом действии после нового вызова onCreate. - person TomBomb; 22.02.2012
comment
В таком случае вы вызываете setContentView() для создания нового экземпляра макета? Старый является частью старого контекста Activity's и был уничтожен, поэтому вам нужен новый. - person DeeV; 22.02.2012
comment
Да, я снова вызываю setContentView(), я не делаю ничего отличного от того, как я обычно создаю экземпляр основного действия. - person TomBomb; 22.02.2012

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

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

Кроме того, как указывает DeeV, к тому времени, когда вызывается onDestroy, действие уже давно завершено, так что это может быть неподходящим местом для того, чтобы делать то, что вы делаете, но нам нужно больше кода, чтобы быть уверенным.

Кстати, сдвинув клавиатуру вверх (на телефонах с выдвижной клавиатурой), вы получите тот же эффект.

person debracey    schedule 03.03.2012
comment
Да, я видел такое поведение в прошлом. Я изменил свою основную активность, так что всплеск — это не отображаемый макет, а сама по себе новая активность. Однако я все еще вижу проблемы в том, что после того, как мое приложение было onDestroy()/onCreated, вызов finishActivity(AppState.ACTIVITY_SPLASH) не имеет никакого эффекта. - person TomBomb; 07.03.2012