方向更改导致活动实例数增加

时间:2012-10-30 05:49:36

标签: android count orientation instance

我有TestActivity。此活动将在Button新闻发布时从主要活动开始。 这就是我在清单文件中声明我的测试活动的方式。

  <activity
        android:name="com.example.MyTestActivity"
        android:configChanges="keyboard|keyboardHidden"
        android:label="MYTESTACtivity"
        android:theme="@style/someTheme"
        android:windowSoftInputMode="stateHidden|adjustPan" >
    </activity>

现在的问题是,一旦显示TestActivity屏幕,如果我进行了方向更改,那么实例计数TestActivity将增加1.如果我再次将其更改为纵向模式,它增加了1。这是实例计数在Orientation Changes期间继续提升的方式。

无论方向变化如何,请建议如何一次只制作一个活动实例。 此外,我尝试添加android:launchMode="SingleTop"仍存在同样的问题。 仅供参考,这是我能够使用严格模式查找实例计数的方法。

01-02 01:39:48.855: E/StrictMode(21992): android.os.StrictMode$InstanceCountViolation: class com.example.MyTestActivity; instances=20; limit=1

4 个答案:

答案 0 :(得分:0)

我决定将我的评论移到答案中,然后对其进行扩展,希望其他新发现这篇文章的人不会在没有进一步思考的情况下接受这个解决方案:

  

android:configChanges:orientation | screensize

Android旨在销毁和重新创建有关配置更改的活动,这是有充分理由的。通过向你的清单添加这些内容,你所做的就是说“我明白我在做什么。我不希望Android按其设计的方式行事,我将处理所有后果。

在某些情况下,这是正确的解决方案,但在大多数情况下,它是错误的,远离“我的问题已解决”,事实上你的问题可能刚刚开始,因为你必须编写更多代码来做什么Android会自动执行。更多代码=更多错误=更低的可维护性。

OP没有提供足够的细节来提供准确的答案,但一般来说,正确的答案是了解活动生命周期(即Android的工作方式),并思考它如何应用于您的应用以及如何处理各种回调。特别是,理解onCreate(),onStart()和onResume()之间以及onPause()和onStop()之间的差异是关键。例如,在onCreate()中放入大量代码是常见的初学者错误。我已经看到几乎所有重要代码都在onCreate()中完成的应用程序并且它并不漂亮。开发人员第一次按下主页按钮,然后返回到他们的应用程序,并想知道为什么它无法正常工作。

http://developer.android.com/reference/android/app/Activity.html#ActivityLifecycle

Yddl在这里给出了一个很好的解释:

Why not use always android:configChanges="keyboardHidden|orientation"?

如果你想进行投票,那么就像我所做的那样对他进行投票,请参考他的回应。

答案 1 :(得分:0)

预期onCreate()调用。每次更改方向时,都会销毁您的活动,然后重新创建,这会导致调用onCreate()。但是,似乎现有的实例没有被销毁,而我所知道的唯一原因就是泄漏。一个常见的原因是当活动被破坏时不解开位图。

答案 2 :(得分:-2)

默认情况下,当屏幕方向在运行时更改时(用户已旋转设备),活动将关闭并重新启动。为了防止这种情况,请在清单中添加以下内容。

android:configChanges="keyboardHidden|orientation"

所以你的清单看起来如下。

<activity
    android:name="com.example.MyTestActivity"
    android:configChanges="keyboard|keyboardHidden"
    android:label="MYTESTACtivity"
    android:theme="@style/someTheme"
    android:windowSoftInputMode="stateHidden|adjustPan" 
    android:configChanges="keyboardHidden|orientation">
</activity>

有关详情,请查看this

答案 3 :(得分:-3)

尝试添加此内容:

<activity
    android:name="com.example.MyTestActivity"
    android:configChanges="keyboard|keyboardHidden|orientation"
   ...../>

在定位变换期间,您的活动不会重新启动。