OnDestroy вызывается каждый раз, когда экран продолжается
Мое приложение убивается каждый раз, когда оно возвращается из экрана вне состояния. Я получаю всю информацию, которую делает мое приложение, но я не могу понять, почему он вызывает onDestroy. Это первый раз, когда я вижу это поведение в своих приложениях.
Моя основная деятельность расширяет tabActivity, потому что она содержит tabhost. Я читал, что он должен продлить его, или он будет FC. Я не уверен, что моя проблема связана с этим?! О, и он реализует Observer, но это не должно быть проблемой.
Вот журналы:
07-21 09:57:53.247: VERBOSE/###(13180): onResume
07-21 09:57:53.267: VERBOSE/###(13180): onPause
07-21 09:57:59.967: VERBOSE/###(13180): onResume
07-21 09:58:00.597: VERBOSE/###(13180): onPause
07-21 09:58:00.597: VERBOSE/###(13180): onDestroy
07-21 09:58:00.637: VERBOSE/###(13180): onCreate
Сумасшедшая вещь заключается в том, что она вызывает onDestroy чаще всего после того, как экран продолжает работать, и иногда у него достаточно времени, чтобы сделать это до того, как экран погаснет. Но после этого он снова делает то же самое...
Я надеюсь, что у кого-то есть подсказка для меня или какая-либо информация о том, как решить эту проблему.
Я не уверен, что это важно, но я использую sroid для Android 2.1-update1 для своего приложения.
EDIT:
Приложение тестируется на реальном устройстве Android.
Вот базовый код со всеми ненужными строками и удаленной информацией:
package;
imports;
public class WebLabActivity extends TabActivity implements Observer{
#declerations
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.v("###", "onCreate");
setContentView(R.layout.main);
# initialize some basic things
}
@Override
public void onResume() {
super.onResume();
Log.v("###", "onResume");
}
@Override
public void onDestroy() {
super.onDestroy();
Log.v("###", "onDestroy");
}
@Override
public void onRestart() {
Log.v("###", "onRestart");
super.onRestart();
}
@Override
public void onPause() {
Log.v("###", "onPause");
super.onPause();
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
Log.v("###", "onConfigurationChanged");
super.onConfigurationChanged(newConfig);
}
@Override
public void update(Observable observable, Object data) {
Log.v("###", "notifyManager.getWho() + " made an Update");
}
private void initializeSidebarTabhost() {
TabSpec 1 = tabHost.newTabSpec("1");
TabSpec 2 = tabHost.newTabSpec("2");
TabSpec 3 = tabHost.newTabSpec("3");
TabSpec 4 = tabHost.newTabSpec("4");
1.setIndicator("###");
2.setIndicator("###");
3.setIndicator("###");
4.setIndicator("###");
addIntents
tabHost.addTab(1); //0
tabHost.addTab(2); //1
tabHost.addTab(3); //2
tabHost.addTab(4); //3
tabHost.getTabWidget().setCurrentTab(2);
}
}
EDIT2:
Хорошо, я протестировал свое приложение без инициализации чего-либо, затем только с расширением активности или без реализации наблюдателя, но мои изменения не повлияли. Каждый раз, когда я устанавливаю свой телефон, чтобы спать, а затем разбудите его, onDestroy()
получите вызов?!
EDIT3:
Хорошо, я узнал что-то интересное.
Сначала здесь мой AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.tundem.###"
android:versionCode="1"
android:versionName="1.0">
<uses-sdk android:minSdkVersion="7" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".###" android:label="@string/app_name" android:screenOrientation="landscape" android:theme="@android:style/Theme.Light.NoTitleBar">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
Как только я удалю screenOrientation="landscape"
, приложение не будет уничтожено при каждом пробуждении моего устройства. Я пробовал его более 10 раз, но больше не звонил на onDestroy()
Итак, я думаю, что мне придется установить это в коде?! Любые подсказки или фрагменты кода?
Ответы
Ответ 1
Если вы хотите остановить проблему destroy/create, которая по умолчанию установлена в android из-за изменения ориентации и блокировки в одной ориентации, вам нужно добавить код и xml
В коде вашей активности (заметки о xml)
// When an android device changes orientation usually the activity is destroyed and recreated with a new
// orientation layout. This method, along with a setting in the the manifest for this activity
// tells the OS to let us handle it instead.
//
// This increases performance and gives us greater control over activity creation and destruction for simple
// activities.
//
// Must place this into the AndroidManifest.xml file for this activity in order for this to work properly
// android:configChanges="keyboardHidden|orientation"
// optionally
// android:screenOrientation="landscape"
@Override
public void onConfigurationChanged(Configuration newConfig)
{
super.onConfigurationChanged(newConfig);
}
Ответ 2
У меня была такая же проблема. Из ActivityA я вызвал ActivityB. Когда я закрыл ActivityB, я ожидал, что ActivityA будет показан, но это не так - оно было уничтожено. Эти проблемы были вызваны следующими атрибутами ActivityA в AndroidManifest.xml:
android:excludeFromRecents="true"
android:noHistory="true"
Из-за них ActivityA был уничтожен после запуска ActivityB.
Ответ 3
mikepenz, в вашем случае, если вам действительно нужен андроид: setorientation = "landscape" означает, что вам не нужно его удалять, просто добавьте этот набор атрибутов android: configchanges = "orientation | Screensize" это не уничтожит вашу активность... надеюсь, это поможет вам.