Android学习笔记2-1--组件1--Application

来源:互联网 发布:淘宝活动时间表 编辑:程序博客网 时间:2024/06/11 16:20

Application

Application是什么?

Android系统会为每个程序运行时创建一个Application类的对象且仅创建一个,所以Application可以说是单例模式的一个类,所以在不同的Activity,Service中获得的对象都是同一个对象。且其对象的生命周期是整个程序中最长的,它的生命周期就等于这个程序的生命周期。所以通过Application来进行一些,数据传递、数据共享、数据缓存等操作。

数据安全

因整个app只有一个application,其他线程都可访问该application,且使用Application如果保存了一些不该保存的对象很容易导致内存泄漏。因此在设计application时面临着线程安全和内存泄漏的问题。

1) 对于变量:使用final ConcurrentHashMap或static\volicate。
2) 对于不操作变量的方法,使用static。
3) 对于要操作变量的方法,使用锁机制。

生命周期

1) onCreate 在创建应用程序时创建
2) onTerminate 当终止应用程序对象时调用(但不保证一定被调用)。当程序是被内核终止以便为其他应用程序释放资源,那么不调用应用程序的对象的onTerminate方法而直接终止进程
3) onLowMemory 当后台程序已经终止资源还匮乏时会调用这个方法。好的应用程序一般会在这个方法里面释放一些不必要的资源,来应付当后台程序已经终止或前台应用程序内存还不够时的情况。
4) onTrimMemory 当系统内存不足时,所有后台程序(不是指后台运行的进程)都被杀死时,系统会自动调用该方法。
4) onConfigurationChanged 当设备配置发生改变,而所在组件还在运行时,系统就会调用该方法去运行自定义的代码(需要manifest设置)。

application被杀死的情况分析:

为了决定在内存较低的时候杀掉哪个进程, Android会根据运行在这些进程内的组件及他们的状态把进程划分成一个”重要程度层次”,当需要给一个进程分类的时候, 系统会在该进程中处于活动状态的所有组件里掉选一个重要等级最高作为分类依据。其重要的程度按以下规则排序:

1:交互进程是持有一个持有运行在屏幕最前端并与用户交互的Activity的进程(onResume方法被调用时),也可是持有一个正在运行的IntentReceiver(也就是说他正在执行自己的onReceiveIntent方法)的进程。除非内存已经低到不够这些进程运行, 这时设备通常已经达到了需要内存整理的状态,否则系统不会主动杀掉这些进程。
2:可视进程是持有一个被用户可见但没有显示在最前端(onPause方法被调用时)的Activity的进程。通常这种进程在一个前端Activity以一个对话框出现并保持该Activity可见时。这种进程被系统认为是极其重要的并且通常不会被杀掉,除非为了保持所有前端进程正常运行不得不杀掉这些可见进程。
3:服务进程是持有一个是由startService()方法启动的Service的进程。尽管这些进程用户不能直接看到, 但是通常他们做的工作用户是十分关注的(例如在后台播放mp3或是在后台下载上传文件)。所以除非为了保持所有的前端进程和可视进程正常运行外, 系统是不会杀掉服务进程的。
4:后台进程是持有一个不再被用户可见的Activity(onStop()方法被调用时)的进程。假如这些进程已经完整的且正确的完成了自己的生命周期, 系统会在为前三种进程释放内存时随时杀掉这些后台进程。通常会有很多的后台进程在运行, 所以这些进程被存放在一个LRU列表中, 以保证在低内存的时候, 最近一个被用户看到的进程会被最后杀掉。
5:空闲进程是没有持有任何活动应用组件的进程。保留这种进程的唯一理由是为了提供一种缓存机制, 缩短他的应用下次运行时的启动时间。就其本身而言, 系统杀掉这些进程的目的是为了在这些空进程和底层的核心缓存之间平衡整个系统的资源。

原创粉丝点击