前言
最近在网上学习安卓,想研究下安卓应用的实现原理。就先从最直观体验的Activity的流程开始研究吧
Activity生命周期
- activity从开始到结束的四个状态。
- activity的生命周期
- activity的进程优先级
1.activity的四个状态
activity四个状态和所在的生命周期 关于activity的四个状态: running-paused-stopped-killed
- running->当前显示在屏幕的activity(位于任务栈的顶部),用户可见状态。
- poused->依旧在用户可见状态,但是界面焦点已经失去,此Activity无法与用户进行交互。
- stopped->用户看不到当前界面,也无法与用户进行交互 完全被覆盖.
- killed->当前界面被销毁,等待这系统被回收
由上图我们得知:
Starting ——–>Running 所执行的生命周期顺序 onCreate()->onstart()->onResume() 当前称为活动状态(Running),此activity所处于任务栈的top中,可以与用户进行交互。
Running ——>Paused 所执行Activity生命周期中的onPause() 当前称为暂停状态(Paused),该Activity已失去了焦点但仍然是可见的状态(包括部分可见)。
Paused ——>Running所执行的生命周期为:OnResume() 当前重新回到活动状态(Running),此情况用户操作home键,然后重新回到当前activity界面发生。
Paused ——>Stoped所执行的生命周期为:onStop() 该Activity被另一个Activity完全覆盖的状态,该Activity变得不可见,所以系统经常会由于内存不足而将该Activity强行结束。
Stoped——>killed所执行的生命周期为:onDestroy() 该Activity被系统销毁。当一个Activity处于暂停状态或停止状态时就随处可能进入死亡状态,因为系统可能因内存不足而强行结束该Activity。
2.activity的生命周期
onCreate(): 当我们点击activity的时候,系统会调用activity的oncreate()方法,在这个方法中我们会初始化当前布局setContentLayout()方法。
onStart(): onCreate()方法完成后,此时activity进入onStart()方法,当前activity是用户可见状态,但没有焦点,与用户不能交互,一般可在当前方法做一些动画的初始化操作。
onResume(): onStart()方法完成之后,此时activity进入onResume()方法中,当前activity状态属于运行状态 (Running),可与用户进行交互。
onPause() 当另外一个activity覆盖当前的acitivty时,此时当前activity会进入到onPause()方法中,当前activity是可见的,但不能与用户交互状态。
onStop() onPause()方法完成之后,此时activity进入onStop()方法,此时activity对用户是不可见的,在系统内存紧张的情况下,有可能会被系统进行回收。所以一般在当前方法可做资源回收。
onDestory() onStop()方法完成之后,此时activity进入到onDestory()方法中,结束当前activity。
onRestart() onRestart()方法在用户按下home()之后,再次进入到当前activity的时候调用。调用顺序onPause()->onStop()->onRestart()->onStart()->onResume().
3.activity优先级
前台进程>可见进程>service进程>后台进程>空进程
前台进程(Foreground process) 前台进程是用户当前做的事所必须的进程,如果满足下面各种情况中的一种,一个进程被认为是在前台:
1.当前进程activity正在与用户进行交互。 2.进程持有一个Service,这个Service处于这几种状态:①Service与用户正在交互的Activity绑定。②Service是在前台运行的,即它调用了 startForeground()。③Service正在执行它的生命周期回调函数(onCreate(), onStart(), or onDestroy())。 3.进程持有一个BroadcostReceiver,这个BroadcostReceiver正在执行onReceive()方法
可见进程(Visible process) 如果一个进程不含有任何前台的组件,但仍可被用户在屏幕上所见。当满足如下任一条件时,进程被认为是可见的:
- 进程持有一个activity,这个activity不再前台,处于onPouse()状态下,当前覆盖的activity是以dialog形式存在的。
- 进程有一个service,这个service和一个可见的Activity进行绑定。
服务进程 (Service process) 服务进程没有和用户可以看到的东西绑定,但是它们一般在做的事情是用户关心的,比如后台播放音乐,后台下载数据等。所以系统会尽量维持它们的运行,除非系统内存不足以维持前台进程和可见进程的运行需要
1.如果一个进程中运行着一个service,这个service是通过 startService() 开启的,并且不属于上面两种较高优先级的情况,这个进程就是一个服务进程
后台进程(Background process) 如果进程不属于上面三种情况,但是进程持有一个用户不可见的activity,后台进程不直接影响用户体验,系统会为了前台进程、可见进程、服务进程而任意杀死后台进程
activity的onStop()被调用,但是onDestroy()没有调用的状态。该进程属于后台进程。
空进程 如果一个进程不包含任何活跃的应用组件,则认为是空进程。
该进程没有任何运行的数据了,且保留在内存空间,并没有被系统killed,属于空进程,该进程很容易被杀死。
评论(0)