【问题标题】:Does onDestroy() or finish() actually kill the activity?onDestroy() 或 finish() 是否真的杀死了活动?
【发布时间】:2011-08-31 19:37:21
【问题描述】:

实际上,我知道我在询问 Android 的简单和基本概念。但我对这些finish()onDestroy() 方法有点困惑。 这是否会终止活动并释放与这些活动相关的资源?

我尝试了一个只包含一个活动的简单应用程序。我认为这个概念就像当应用程序运行时,活动将启动。当我们单击后退按钮时,它将完成。我在每个生命周期方法中给出了一些 toast 消息,用于了解内存使用情况。当我单击后退按钮时,它执行onPause()onStop()onDestroy()。我以为这个活动结束了。但是当我再次重新启动应用程序时,它比上次占用了更多的内存。每次我从 eclipse 运行应用程序或从主屏幕重新启动应用程序时都会发生这种情况。

为什么会这样?我怎样才能真正销毁应用程序/活动以释放内存?


我包括我的代码。我只在课堂上给出一条祝酒词。然后内存使用量也在增加。

每次运行应用程序时,分配的大小都会增加,例如:3302744、3442384、3474552

 public class myActivity extends Activity
   {
         @Override
         public void onCreate(Bundle savedInstanceState)
         {
             super.onCreate(savedInstanceState);     
        Toast.makeText(getBaseContext()," allocated size  = " + Debug.getNativeHeapAllocatedSize(), 1).show();      
         }

   }

清单:

<application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name=".myActivity "  
                  android:label="@string/app_name"  >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity> 
 </application>

为什么内存每次都在增加?

【问题讨论】:

    标签: android memory-management activity-lifecycle ondestroy


    【解决方案1】:

    默认行为是返回按钮将导致活动退出并被销毁。 不过,在 onDestroy 或 onPause 中显示 toast 并不是一个好主意。它会以您不希望发生的方式改变您的活动的生命周期。 请改用日志记录,这样您就会看到真正发生的事情。 顺便说一句,finish() 是您从代码中显式调用的东西,而 onDestroy() 是一个生命周期事件/方法,由于以任何方式完成/破坏活动而被调用。

    【讨论】:

    • 感谢您提供的信息.. 但是如果活动实际完成(资源设置为空闲),为什么每次内存都在增加?
    • 我建议使用 Eclipse 的 MAT 插件来解决内存泄漏问题。您的方法可能没有报告您要观察的内容。 (首先离开 Toasts 并切换到日志行)
    【解决方案2】:

    Finish() 将真正完成您的活动,如果不存在引用,GC 将恢复资源。 onDestory() 实际上是系统在销毁您的活动时将调用的方法,您应该实现此功能。您不必担心破坏您的应用程序,android 会为您解决。

    【讨论】:

    • destroy表示是否释放内存?
    • 垃圾收集器将回收所有对它们没有任何引用的对象的内存。但正如我所说,你不能调用/不应该调用 onDestroy ,这是框架的工作
    【解决方案3】:

    finish() 会终止活动并释放内存...除非您存储了一些泄露的引用...例如 onRetainNonConfigurationInstance() 等方法

    当你按下后退按钮时,调用的是 finish() 方法,然后调用 onPause、onStop、onDestroy。

    【讨论】:

    • +1 用于在很少的句子中传达如此多的关键信息。简洁而准确的艺术。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-24
    相关资源
    最近更新 更多