生命周期概念:个人理解是对象从产生到消亡的过程。
安卓开发中涉及到的生命周期
一 APP的生命周期-由操作系统管理
APP是在各自独立的 Linux 进程中运行。当APP图标被点击或其中某些部分被请求时,它的进程就fork出来;当这个程序没有必要再运行下去且系统需要回收这个进程的内存用于其他程序时,这个进程被销毁掉。
进程销毁回收内存资源依照进程重要性来决定:
1. 前台进程:进程拥有active状态下的 activity(屏幕显示并且持有焦点能进行交互) 或者它的一个IntentReciver 正在运行,或者设置为forceground的进程。特点重要性最高,通常不会被结束。
2. 可见进程。进程拥有在屏幕上显示被用户可见但处于onpause状态的activity。比如一个前台进程以对话框的形式显示在该进程前面。特点进程也很重要,只有在系统没有足够内存运行所有前台进程时,该进程才会被结束。
3. 服务进程。进程拥有有startservice开启的服务可在后台持续运行,比如后台音乐播放、后台数据上传下载等。特点进程对用户来说很有用,只有当系统没有足够内存来维持所有的前台和可见进程时,才会被结束。
4. 后台进程。程序拥有一个用户不可见的activity(onstop方法被调用时)。特点进程在系统内存不足时,按照 LRU 的顺序被结束。
5. 空进程。这样的进程不包含任何活动的程序部件。存在原因提供一种缓存机制, 缩短他的利用下次运行时的启动时间。特点系统可能随时关闭这类进程。
二 application的生命周期
application是安卓的一个系统组件,是所有组件中生命周期最长的,等同于进程的生命周期。全局单利模式的典范。当程序被关闭时application也会关闭。
生命周期函数
onCreate 在创建应用用程序时调用
onTerminate 当终止应用程序时调用,不保证一定被调用,例如当应用被内核终止以便为其他应用释放资源,那么将不会提示,并且不调用利用程序的对象的onTerminate方法而直接终止进程
onLowMemory 当后台程序已终止资源还匮乏时会调用这个方法。好的应用程序一般会在这个方法里面释放些没必要要的资源来应付当后台程序已终止前台利用程序内存还不够时的情况。
onConfigurationChanged 配置改变时触发这个方法。
三 activity的生命周期
Google官方的activity生命周期图
完整生命流程:onCreate(bundle onSaveInstanceState)->onStart()->onResume()->
onPause()->onStop()->onDestroy();
active:activity处于可见可交互状态
一般经历onCreate()->onStart()->onResume();
从paused状态返回active态(各种弹框和popupwindow消失)onPause()->onResume();
从stopped状态返回active(从第二activity点击back返回,从home键主界面返回)onRestart()->onStart()->onResume();
paused:activity处于可见但不可交互状态,常见弹出各种弹框遮住activity
一般经历由onResume()到onPause();
stopped:activity处于不可见不可交互状态,常见被新的activity覆盖,按home键进入主界面
调用onstop()
需注意onCreate()是生命周期的开始必调用且只调用一次。
onDestroy()是生命周期的结束,一般调用back键返回或者调用finish()方法后会调用onDestroy()方法;当系统因为内存紧张又开启更重要的进程时,会回收处于onStop()的activity,导致并不能走onDestroy()方法。
四 service生命周期
4.1通过startService()方法开启的服务
通过context.startService()方法开启的service,生命周期不与调用者的生命周期绑定当调用者退出后仍可以运行;第一次开启时会经历onCreate()->onStart() 方法;如果service没有被停止,当再次开启时只调用onStart()方法;需要结束服务时调用context.stopService()或者Service.stopSelfResult()方法。
4.2通过bindService开启的服务
通过context.bindService(intent)方法开启的服务,如果服务没有启动同样需要经历oncreat()方法,不同于startService()的是,需要调用onBind()方法来绑定服务到调用者;解除绑定用context.unbindService(serviceConnection)会调用onUbind和onDestroy结束服务。
五 broadcast Receiver的生命周期
Broadcast Receiver的生命周期只有一个回调方法:void onReceive(Context curContext,Intent broadcastMsg)。broadcast消息到达接收者并执行onReceive方法时,被认为是活动的。当onReceive()方法返回时,它停止的活动状态。
六 fragment的生命周期
fragment生命周期跟activity生命周期类似,可以说依附于activity。
官方周期图
当fragment被创建时,会调用onAttach()方法从activity中获得相关值,调用onCreate()方法初始化fragment,调用onCreatView()方法绘制UI布局,当相关联的activity在onCreate()完成后会调用到fragment的onActivityCreated()方法;
当fragmen处于可见状态时同activity一样调用onStart()方法;当fragment处于可交互状态时调用onResume()方法;当fragment处于可见不可交互时如有弹框遮挡调用onPaused()方法;当fragment处于不可见不可交互时调用onStop()方法;当fragment被销毁时会一次调用onPaused->onStop->onDestroyView->onDestroy->onDetach方法。
fragment之间的切换
切换到其他Fragment
onPause() onStop() onDestroyView()切换回本身的Fragment
onCreateView() onActivityCreated() onStart() onResume()
七 view的生命周期
关键生命周期:view默认是可见的,不可见时调用onVisibilityChanged函数->调用次view的构造方法(layout中的view调用两个参数构造法,代码中的view调用一个参数构造法)->从布局文件中inflate完成调用onFinishInflate->view添加到window调用onTachedToWindow(gone则生命结束)->调用onMeasure方法测量view大小->调用onLayout方法确定view在layout中的位置(invisible则生命结束)->调用onDraw方法绘制view->销毁时调用onDetackedFromWindow,销毁跟view可见性无关