Android活动方向改变,每次新实例

时间:2015-03-18 06:20:56

标签: android memory-leaks xamarin garbage-collection screen-orientation

我创建了非常简单的活动TempActivity,没有内容视图,仅用于测试目的。当这个活动加载到Android手机时,我做了大约40次方向更改,我把堆文件作为hprof并导出到MAT工具并进行检查。它显示了我的TempActivity的40个实例,并且在每个实例中都有许多用于操作栏视图的类,如linearlayout,imageview等。

每当我旋转屏幕时,DDMS显示为此应用程序添加到堆中的内存越来越多,理想情况下,不应该在一段时间后进行垃圾回收?当我强行执行GC时,它仍然没有被清除,它显示堆中的内存增加。

请告诉我这是Android的默认行为,我们可以做些什么来删除所有以前的活动实例吗?这是内存泄漏的情况吗?因为在我的实时应用程序中(在contentview中有图像和其他内容),我在旋转屏幕时遇到同样的问题,每次创建新的实例活动并且堆大小不断增加。

是不是因为默认的ActionBar imageview,linearlayout或其他控件自动内置了每个android活动?

这是我的临时活动课程:

[Activity(Label = "TempAcivity", MainLauncher = true)]
public class TempAcivity : Activity
{
    protected override void OnCreate(Bundle bundle)
    {
        base.OnCreate(bundle);

        // Create your application here
    }
}

修改

这是我的清单文件和样式文件,它适用于应用程序

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="HF.Mobility.Android" android:versionCode="1" android:versionName="1.0" android:installLocation="auto">
<uses-sdk android:minSdkVersion="10" android:targetSdkVersion="21" />
<application android:label="Health Hub" android:theme="@style/CustomHoloTheme" android:icon="@drawable/ApplicationIcon" android:allowBackup="false">
    <application android:label="@string/ApplicationName"></application>
</application>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<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" />
<uses-permission android:name="android.permission.VIBRATE" />
</manifest>

样式文件:

<?xml version="1.0" encoding="utf-8" ?>
<resources>
 <style name="CustomHoloTheme" parent="@android:style/Theme.Holo.Light">
  <item name="android:windowContentOverlay">@null</item>
  <item name="android:windowActionBarOverlay">true</item>
  <item name="android:icon">@android:color/transparent</item>
  <item name="android:actionBarStyle">@style/MyTheme.ActionBarStyle</item>
  <item name="android:itemTextAppearance">@style/myCustomMenuTextApearance </item>
  <item name="android:typeface">monospace</item>
 </style>

 <style name="MyTheme.ActionBarStyle"   parent="@android:style/Widget.Holo.Light.ActionBar">
  <item name="android:titleTextStyle">@style/MyTheme.ActionBar.TitleTextStyle</item>
  <item name="android:background">@drawable/actionbar_background</item>
 </style>
 <style name="MyTheme.ActionBar.TitleTextStyle" parent="@android:style/TextAppearance.Holo.Widget.ActionBar.Title">
  <item name="android:textColor">#FFFFFF</item>
 </style>
 <style name="myCustomMenuTextApearance" parent="@android:style/TextAppearance.Widget.IconMenu.Item">
  <item name="android:textColor">@color/xam_green</item>
 </style> 
</resources>

这是actionbar_background.xml文件:

<?xml version="1.0" encoding="utf-8" ?>
 <layer-list xmlns:android="http://schemas.android.com/apk/res/android">
  <item>
   <shape>
     <solid android:color="#00000000" />
   </shape>
  </item>
</layer-list>

1 个答案:

答案 0 :(得分:1)

编辑:在他的链接帖子中做@Matt R概述似乎是最好的方式,下面的答案更像是“最后的手段”,这也是Android文档对其进行分类的方式。

来自文档:

  

注意:自行处理配置更改会使使用备用资源变得更加困难,因为系统不会自动为您应用这些资源。当您必须避免因配置更改而重新启动时,此技术应被视为最后的手段,并且不建议用于大多数应用程序。

原帖:

这听起来像将它添加到您的AndroidManifest.xml会有所帮助,因为它会使得不会在方向更改时重新创建Activity:

<activity android:name=".TempAcivity"
          android:configChanges="orientation|screenSize|keyboardHidden"
          android:label="@string/app_name">

此配置的文档状态:

  

现在,当其中一个配置发生更改时,MyActivity不会重新启动。相反,MyActivity接收对onConfigurationChanged()的调用。此方法传递一个Configuration对象,该对象指定新设备配置。通过读取“配置”中的字段,您可以确定新配置并通过更新界面中使用的资源进行适当的更改。在调用此方法时,您的活动的Resources对象会更新以根据新配置返回资源,因此您可以轻松重置UI的元素,而无需系统重新启动您的活动。

链接:http://developer.android.com/guide/topics/resources/runtime-changes.html

也请参阅此帖:How to detect orientation change in layout in Android?