`
wayfarer
  • 浏览: 294342 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Android's Components 生命周期

阅读更多

Android中,Component(activity、service和broadcast receivers)的生命周期始于其响应一个Intent请求,终于该Component销毁。在这期间,Component可能处于激活/未激活、可见/不可见的状态。

 

1. Activity堆栈  

      每个Actvity的状态由它所在Activity栈中的位置所决定,所有当前正在运行的Actvity将遵循照后进先出的原则。当一个新的 Activity启动,当前的Activity将移至堆栈的顶部,如果用户使用Back按钮,或在前台Activity被关闭,下一个Activity将被激活并且移至到堆栈的顶部。这个过程如下图所示:

 

2. Activity 状态

      随着Activity的创建和销毁,也就会进出栈如上图所示,其中可能会经历以下四种状态:

  • Active状态:这时候Activity处于栈顶,且是可见的,有焦点的,能够于用户互动。当另一个Activity变成Active时,当前 的将变成Paused状态;
  • Paused状态:Activity仍然可见但没有焦点,在这时候Actvity处于Paused状态(例如,如果有一个透明或非全屏幕上的Activity在你的Actvity上面)。处于Paused状态的Actvity是alive的(保持状态、成员信息并绑定到窗口管理器),但当系统内存不足的时候会被killed;
  • Stopped状态:当Activity是不可见的时,Activity处于Stopped状态(仍可以保存状态和成员信息,但不绑定在窗口管理器)。假设系统需要内存的话,它是被回收对象的主要候选。当Activity处于Stopped状态时,一定要保存当前数据和当前的UI状态,否则一 旦Activity退出或关闭时,当前的数据和UI状态就丢失了。
  • Inactive状态:Activity被杀掉以后或者被启动以前,处于Inactive状态。这时Activity已被移除从Activity堆栈中,需要重新启动才可以显示和使用。

        

public class MyActivity extends Activity {
	// 在Activity生命周期开始时被调用
	public void onCreate(Bundle icicle) {
	}

	// 当activity对用户即将可见的时候调用。
	public void onStart() {
	}

	// 当activity从停止状态重新启动时调用
	public void onRestart() {
	}

	// 当activity将要与用户交互时调用此方法,此时activity在activity栈的栈顶,用户输入已经可以传递给它
	public void onResume() {
	}

	// 当系统要启动一个其他的activity时调用(其他的activity显示之前),这个方法被用来提交那些持久数据的改变、停止动画、和其他占用
	// CPU资源的东西。由于下一个activity在这个方法返回之前不会resumed,所以实现这个方法时代码执行要尽可能快。
	public void onPause() {
	}

	// 当另外一个activity恢复并遮盖住此activity,导致其对用户不再可见时调用。一个新activity启动、其它activity被切换至前景、当前activity被销毁时都会发生这种场景。
	public void onStop() {
	}

	// 在activity被销毁前所调用的最后一个方法,当进程终止时会出现这种情况
	public void onDestroy() {
	}

	// onCreate完成后被调用,用来回复UI状态
	public void onRestoreInstanceState(Bundle savedInstanceState) {
	}

	// Activity即将移出栈顶保留UI状态时调用此方法
	public void onSaveInstanceState(Bundle savedInstanceState) {
	}

}

OPhone Runtime将首先杀掉处于Stopped状态的Activity,在极端情况下,也会杀掉那些处于Paused状态的Activity。 为确保无缝的用户体验,这些状态之间的过渡对用户来说应该做到透明的。不管Activity处于那种状态,最重要的是保留好UI状态和用户数据,一旦Actvity被激活,用户都能看到他想要的东西。

你后台的Activity被系统回收怎么办:onSaveInstanceState
当你的程序中某一个Activity A在运行时,主动或被动地运行另一个新的Activity B,这个时候A会执行onSaveInstanceState()。B完成以后又会来找A,这个时候就有两种情况:一是A被回收,二是A没有被回收,被回收的A就要重新调用onCreate()方法,不同于直接启动的是这回onCreate()里是带上了参数savedInstanceState;而没被收回的就直接执行onResume(),跳过onCreate()了。
savedInstanceState是一个Bundle对象,你基本上可以把他理解为系统帮你维护的一个Map对象。在onCreate()里你可能会用到它,如果正常启动onCreate就不会有它,所以用的时候要判断一下Bundle savedInstanceState是否为空。
就像官方的Notepad教程里的情况,你正在编辑某一个note,突然被中断,那么就把这个note的id记住,再起来的时候就可以根据这个id去把那个note取出来,程序就完整一些。这也是看你的应用需不需要保存什么,比如你的界面就是读取一个列表,那就不需要特殊记住什么,哦,没准你需要记住滚动条的位置...

 

3. Activity周期
(1)完整生命周期:开始于调用onCreate()(初始化的用户界面,分配引用类变量,绑定数据控件,并创建服务和线程),在OnCreate方法的参数Bundle包含最后一次调用onSaveInstanceState保存的UI状态,你可以使用这个Bundle恢复用户界面到以前的状态,无论是在OnCreate方法或通过覆盖onRestoreInstanceStateMethod方法 。为了避免创造短期对象和增加垃圾收集的时间,以致对用户体验产生直接影响,如果你的Activity需要创建一些对象的话,最好在onCreate方法中创建,因为在Actvity的完整生命周期中它仅会被调用一次;结束于调用onDestroy()(释放所有的资源,确保所有外部连接被关闭,例如网络或数据库的连接)。有时,OPhone Runtime将杀掉一个Activity且不调用onDestroy()。

(2)可见生命周期:开始于onStart()结束于onStop()。在这期间此Acitvity是可见的(尽管它可能没有焦点,也可能部分被遮挡着)。OnStop方法用于暂停或停止动画,线程,定时器,服务或其他专门用于更新用户界面程序,当用户界面是再次可见时,使用OnStart(或onRestart)方法来恢复或重新启动这些程序 ,当一个Activity被重现可见时onRestart方法优先于onStart被调用。OnStart / OnStop方法也被用来注册和注销Broadcast Reciever 。在一个Activity完整生命周期中可能会经过几个Activity可见生命周期。在极端情况下,OPhone Runtime将杀掉一个Activity即使它在可见状态并且并不调用onStop方法。

(3)活跃生命周期:始于onResume()方法,结束于onPause()方法。一个活跃的Actvity总是在前台并且接收用户输入事件。因为用户会频繁的从暂停、恢复状态切换(例如,当设备待机或一个新的activity启动的时候onPause()会被调用;当传入一个新的intent进来时onResume()被调用。因此,这2个方法内的代码应该是轻量级的以确保您的应用程序能够快速响应Acitvity在前台和后台之间切换。 在调用onPause之前onSaveInstanceState会被调用保存UI状态(如检查按钮状态,用户焦点,未提交用户输入) ,这个方法提供了一个机会保存当前的UI状态到Bundle当中。 Bundle信息将会被传递到OnCreate和onRestoreInstanceState方法

 

4. Activity生命周期示例

必调用的三个方法:onCreate() --> onStart() --> onResume(),用AAA表示

(1)父Activity启动子Activity,子Actvity退出,父Activity调用顺序如下
AAA --> onFreeze() --> onPause() --> onStop() --> onRestart() --> onStart(),onResume() …
(2)用户点击Home,Actvity调用顺序如下
AAA --> onFreeze() --> onPause() --> onStop() -- Maybe --> onDestroy() – Maybe
(3)调用finish(), Activity调用顺序如下
AAA --> onPause() --> onStop() --> onDestroy()
(4)在Activity上显示dialog, Activity调用顺序如下
AAA
(5)在父Activity上显示透明的或非全屏的activity,Activity调用顺序如下
AAA --> onFreeze() --> onPause()
(6)设备进入睡眠状态,Activity调用顺序如下
AAA --> onFreeze() --> onPause()

  • 大小: 31.4 KB
  • 大小: 34.4 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics