现在的位置: 首页 > 编程技术 > 安卓开发 > 正文

Onterminate和onlowmemory的使用

2015年12月14日 安卓开发 ⁄ 共 3366字 ⁄ 字号 Onterminate和onlowmemory的使用已关闭评论 ⁄ 阅读 641 次
文章目录

关于Application类有以下公开方法:

Onterminate和onlowmemory的使用

其中最常用的就是onCreaet()、onTerminate()以及onLowMemory()方法,onCreaet()它会在这个类实例化的时候调用(这个地方需要十分注意, 它只会在程序第一次启动的时候调用,不是每次都调用,因为Application类会在创建包的时候初始化),onTerminate()会在app关闭的时候调用, onLowMemory()是在内存过低的情况下调用的。那onTerminate()是干什么用的呢?网上介绍说是在程序终结的时候调用,从下面的实例中也是这样用的。 不过在Google的开发文档以及很多书籍对这个类的用法很少提及,但实际开发情况是如何的呢。

onTerminate的使用

onTerminate()会在app关闭的时候调用,但是就像onDestroy()一样,不能保证一定会被调用。所以最好不要依赖这个方法做重要的处理, 这个方法最多可以用来销毁一写对象,清除一下缓存,但是也并不能保证一定会清除掉,其他操作,例如想在程序结束保存数据,用这个方法明显是错误的。

使用方法如下:

清除http连接:

public void onTerminate()
  {
    super.onTerminate();
    shutdownHttpClient();
  }
  
   private void shutdownHttpClient()
    {
      if ((this.httpClient != null) && (this.httpClient.getConnectionManager() != null)) {
        this.httpClient.getConnectionManager().shutdown();
      }
    }

清除缓存、日志和地图

public void onTerminate()
  {
    if (this.mBMapMan != null)
    {
      this.mBMapMan.destroy();
      this.mBMapMan = null;
    }
    super.onTerminate();
    new Thread()
    {
      public void run()
      {
        App.delete(new File(Environment.getExternalStorageDirectory() + "/xxx/Diary/"));
      }
    }.start();
  }

清除ActivityLifecycleCallbacks的注册

@Override
    public void onTerminate() {
        unregisterActivityLifecycleCallbacks(mActivityWatcher);
        super.onTerminate();
    }

onLowMemory

onLowMemory()在内存比较紧张时,根据优先级把后台程序杀死时,系统回调他,它用在14之前,14之后就出现了onTrimMemory()

源码如下:

public void onLowMemory() {
        Object[] callbacks = collectComponentCallbacks();
        if (callbacks != null) {
            for (int i=0; i<callbacks.length; i++) {
                ((ComponentCallbacks)callbacks[i]).onLowMemory();
            }
        }
    }

    public void onTrimMemory(int level) {
        Object[] callbacks = collectComponentCallbacks();
        if (callbacks != null) {
            for (int i=0; i<callbacks.length; i++) {
                Object c = callbacks[i];
                if (c instanceof ComponentCallbacks2) {
                    ((ComponentCallbacks2)c).onTrimMemory(level);
                }
            }
        }
    }

onLowMemory:Android系统提供了一些回调来通知当前应用的内存使用情况,通常来说,当所有的background应用都被kill掉的时候,forground 应用会收到onLowMemory()的回调。在这种情况下,需要尽快释放当前应用的非必须的内存资源,从而确保系统能够继续稳定运行。

OnTrimMemory:Android系统从4.0开始还提供了onTrimMemory()的回调,当系统内存达到某些条件的时候,所有正在运行的应用都会收到这个回调, 同时在这个回调里面会传递以下的参数,代表不同的内存使用情况,收到onTrimMemory()回调的时候,需要根据传递的参数类型进行判断, 合理的选择释放自身的一些内存占用,一方面可以提高系统的整体运行流畅度,另外也可以避免自己被系统判断为优先需要杀掉的应用。

  • TRIM_MEMORY_UI_HIDDEN 你的应用程序的所有UI界面被隐藏了,即用户点击了Home键或者Back键退出应用,导致应用的UI界面完全不可见。 这个时候应该释放一些不可见的时候非必须的资源.

当程序正在前台运行的时候,可能会接收到从onTrimMemory()中返回的下面的值之一:

  • TRIM_MEMORY_RUNNING_CRITICAL 你的应用仍在运行,但是系统已经把LRU Cache中的大多数进程都已经杀死,因此你应该立即释放所有非必须的资源。如果系统不能回收到足够的RAM数量, 系统将会清除所有的LRU缓存中的进程,并且开始杀死那些之前被认为不应该杀死的进程,例如那个包含了一个运行态Service的进程。
  • TRIM_MEMORY_RUNNING_LOW 你的应用正在运行且没有被列为可杀死的。但是设备正运行于更低内存的状态下,你应该释放不用的资源用来提升系统性能。
  • TRIM_MEMORY_RUNNING_MODERATE 你的应用正在运行并且不会被列为可杀死的。但是设备此时正运行于低内存状态下,系统开始触发杀死LRU Cache中的Process的机制。

当应用进程退到后台正在被Cached的时候,可能会接收到从onTrimMemory()中返回的下面的值之一:

  • TRIM_MEMORY_BACKGROUND 系统正运行于低内存状态并且你的进程正处于LRU缓存名单中最不容易杀掉的位置。尽管你的应用进程并不是处于被杀掉的高危险状态,系统可能已经开始杀掉LRU缓存中的其他进程了。你应该释放那些容易恢复的资源,以便于你的进程可以保留下来,这样当用户回退到你的应用的时候才能够迅速恢复。
  • TRIM_MEMORY_MODERATE 系统正运行于低内存状态并且你的进程已经已经接近LRU名单的中部位置。如果系统开始变得更加内存紧张,你的进程是有可能被杀死的。
  • TRIM_MEMORY_COMPLETE 系统正运行于低内存的状态并且你的进程正处于LRU名单中最容易被杀掉的位置。你应该释放任何不影响你的应用恢复状态的资源。

因为onTrimMemory()的回调是在API 14才被加进来的,对于老的版本,你可以使用onLowMemory)回调来进行兼容。onLowMemory相当与TRIM_MEMORY_COMPLETE。

请注意:当系统开始清除LRU缓存中的进程时,虽然它首先按照LRU的顺序来执行操作,但是它同样会考虑进程的内存使用量以及其他因素。占用越少的进程越容易被留下来。

OnLowMemory()和OnTrimMemory()的比较

1.OnLowMemory被回调时,已经没有后台进程;而onTrimMemory被回调时,还有后台进程。

2.OnLowMemory是在最后一个后台进程被杀时调用,一般情况是low memory killer 杀进程后触发;而OnTrimMemory的触发更频繁, 每次计算进程优先级时,只要满足条件,都会触发。

3.通过一键清理后,OnLowMemory不会被触发,而OnTrimMemory会被触发一次。

使用举例:

@Override
public void onTrimMemory(int level) {
    Log.e(TAG, " onTrimMemory ... level:" + level);     
}

@Override
public void onLowMemory() {     
    Log.e(TAG, " onLowMemory ... ");     
}

抱歉!评论已关闭.