【问题标题】:onDestroy gets called each time the screen goes on每次屏幕打开时都会调用 onDestroy
【发布时间】:2023-03-24 21:53:01
【问题描述】:

每次从屏幕关闭状态返回时,我的应用程序都会被终止。我获取了我的应用程序所做的所有信息,但我不知道它为什么调用 onDestroy。这是我第一次在我的应用程序中看到这种行为。

我的主要活动扩展了 tabActivity,因为它包含一个 tabhost。我读过它必须扩展它,否则它将是 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()

所以我认为我必须在代码中设置它?!任何提示或代码片段?

【问题讨论】:

  • 这听起来有点奇怪,这是在模拟器中,你能发布一个展示该行为的骨架代码框架吗?
  • 在模拟器上我还没试过。我在真正的 Android 手机上得到了这种行为,所以没有模拟器。你的意思是什么表现出这种行为。我将在接下来的几分钟内发布一些代码。
  • 我的意思是一些可验证地重现问题的代码,有时人们提出的 sn-ps 忽略了真正的问题
  • 我提出了我认为很重要的代码,因为如果我忽略了我留下的示例代码,我确信这些东西不会导致问题。还是您认为 addListeners 可能有问题。更新时打开文件,调用方法initizialSidebarTabhost,然后调用addObserver?!我认为问题是由扩展 TabActivity 引起的,但是你知道我如何使用 tabhost 的任何其他技巧吗?!
  • @mikepenz 这很奇怪。但不知何故也很好 - 你无法控制 android 操作系统何时销毁或重新创建你的应用程序,所以你应该让你的应用程序不受这种行为的影响。你永远不知道在带有制造商定制的真实设备上会发生什么:)

标签: android screen onresume ondestroy onpause


【解决方案1】:

如果您想停止由于方向更改而在 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);
    }

【讨论】:

  • 几分钟前我自己找到了这个解决方案。因为我必须降低声誉,所以无法在此处发布。但是非常感谢您的回答;)我希望它对所有其他人都有用
  • @mikepenz - 很高兴的讨论让你找到了自己的解决方案,干杯
  • 是的,如果您单独找到答案,那就太好了;)。得到别人的帮助也很棒。所以再次感谢您的帮助。我敢肯定我需要几个小时才能找到相同的解决方案。 ;)。但是您是对的,有时或经常人们忘记了导致问题的要点然后在他们的主要问题中。再次感谢;)
  • 如果您的目标是 API 版本 13 或更高版本,您还需要将 |screenSize 添加到清单中的 configChanges 列表中。 developer.android.com/guide/topics/resources/…
  • 另外,如果您正在做的只是调用无论如何都会被调用的super.onConfigurationChanged() 函数,那么您实际上并不需要添加 Java 代码。
【解决方案2】:

我有同样的问题。我从 ActivityA 调用了 ActivityB。当我关闭 ActivityB 时,我希望 ActivityA 会显示,但事实并非如此——它被破坏了。此问题是由 AndroidManifest.xml 中 ActivityA 的以下属性引起的:

android:excludeFromRecents="true"
android:noHistory="true"

因为它们 ActivityA 在 ActivityB 启动后被销毁。

【讨论】:

  • 不同的问题。但很有用。
【解决方案3】:

mikepenz,在你的情况下,如果你真的需要一个 android:setorientation = "landscape" 意味着,你不需要删除它,只需添加这些属性集 android:configchanges = "orientation|Screensize" 这不会破坏你的活动。 ..希望这对你有帮助。

【讨论】:

  • 仅供参考,它不会以这种方式工作,需要:(注意屏幕大小中的小写 s,然后是大写 S)android:configChanges="keyboardHidden|orientation|screenSize"
  • 那么是导致它的实际方向变化吗?我看到这种情况有时会发生(我有 screenOrientation="portrait"),但它是随机的,不会一直发生,如果我只是改变设备的方向也不会发生。如何判断是哪个配置更改导致了这种情况?
猜你喜欢
  • 1970-01-01
  • 2011-10-04
  • 2020-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-29
  • 2023-03-18
  • 2021-01-21
相关资源
最近更新 更多