web-dev-qa-db-ja.com

画面が進むたびにonDestroyが呼び出されます

私のアプリケーションは、画面がオフの状態から戻るたびに強制終了されます。私はアプリが行うすべての情報をフェッチしますが、なぜonDestroyを呼び出すのかわかりません。アプリケーションでこの動作が見られるのはこれが初めてです。

タブホストが含まれているため、私のメインアクティビティはtabActivityを拡張します。私はそれがそれを拡張しなければならないか、それがFCになるだろうと読んだ。私の問題がこれに関連しているかどうかわかりません!?ああ、それはオブザーバーを実装していますが、これは問題ありません。

ここにログがあります:

_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が呼び出され、画面が消える前にこれを実行するのに十分な時間がある場合があります。しかし、それが再び起こった後、それは再び同じことをします...

誰かが私のためのヒント、またはこの問題を解決する方法についての情報を持っていることを願っています。

これが重要かどうかはわかりませんが、Android 2.1-update1 sdkをアプリケーションに使用しています。


編集:

アプリケーションは実際の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()への呼び出しはもうありません

だから私はこれをコードで設定する必要があると思いますか?!ヒントやコードの断片はありますか?

25
mikepenz

Androidで方向が変更され、1つの方向でロックされているため、デフォルトであるdestroy/createの問題を停止する場合は、code and xmlを追加する必要があります。

あなたのactivitesコード(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);
    }
39
Idistic

同じ問題がありました。 ActivityAからActivityBを呼び出しました。 ActivityBを閉じたときに、ActivityAが表示されることを期待していましたが、表示されませんでした-破棄されました。この問題は、AndroidManifest.xmlのActivityAの次の属性が原因で発生しました。

Android:excludeFromRecents="true"
Android:noHistory="true"

そのため、ActivityBの開始後にActivityAが破棄されました。

8
Mario Kutlev

mikepenz、あなたの場合、本当にAndroid:setorientation = "landscape"が必要な場合、それを削除する必要はありません。これらの属性Android:configchanges = "orientation | Screensize"のセットを追加するだけで、これはアクティビティを破壊しません...希望これはあなたを助けます。

4
prasanna