Activit——生命周期

         通过实现回调函数来管理Activity的生命周期,对实现一个强大和灵活的应用是至关重要的。而一个Activity的生命周期是受到其他相关activity和任务栈和返回栈影响的。

一个Activity的存在时可能是以下三种状态中的一种:

         Resumed,此时Activity置于屏幕最上层,且拥有焦点运行在前台,用于用户交互,这种状态就是所谓的此Activity正在运行时。

         Paused,Acitivty仍然可见,而其他Actvity在屏幕前端且拥有焦点,在其之上。此时的Activity实际上是透明的,或者说其没有覆盖整个屏幕。Activity完全存在,存在于系统的内存中,且保留有所有的状况和成员信息,但是当在系统内存极度匮乏时会被系统杀死。

         Stopped,此时Activity完全被另一个Activity遮盖,即其存在于后台。Activity此时仍然存在于系统的内存中,且保留有所有的状况和成员信息,但是已经不附在在Windwo Manager(窗口管理器)上了。此时Activity对用户来说已经不可见了,当在内存需要用到其他地方时被系统杀死。

         当一个Activity处在Paused或者Stopped状态时,系统可以调用它的finish()在内存被别的地方使用时销毁。

         1.实现生命周期回调函数:

         当一个Activit在上面的几种状态中切换时,将会通知它的不同回调函数,因此可以通过重写回调函数去实现合适的工作。Activity的生命周期的基本方法:

public class ToStartActivity extends Activity {
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		Log.e("zy", "activity 正创建");
	}
	
	@Override
	protected void onStart() {
		super.onStart();
		Log.e("zy", "activity 即将可见");
	}
	
	@Override
	protected void onResume(){
		super.onResume();
		Log.e("zy", "activity 已经可见(已经恢复可见)");
	}
	
	@Override
	protected void onPause(){
		super.onPause();
		Log.e("zy", "其他的activity拥有焦点(activity 暂停)");
	}
	
	@Override
	protected void onStop(){
		super.onStop();
		Log.e("zy", "activty 不可见(activity 停止)");
	}
	
	@Override
	protected void onDestroy(){
		super.onDestroy();
		Log.e("zy", "activty 将被销毁");
	}
}
         注意:进行生命周期方法的重写时,必须先继承父类Activity的方法,然后再添加自己的行为。

         2.生命周期中嵌套的三重循环:

         综上,这些方法定义了Activity的整个生命周期,通过实现这些方法,可以监听生命周期存在的三重循环。

         (1)Activity的整个生命时间是在调用onCreate()开始到调用onDestroy()销毁之间,Activity可以在onCreate()中设置其形状、布局(定义layout),在onDestroy()中释放所有的资源。比如,一个Activity有一个线程在运行在后台从网络断下载数据,这个线程应该是在onCreate()中创建的,在onDestroy()中停止的。

         (2)Activity的可见(visible)时间是在调用onStart()开始到调用onStop()之间,在这断时间中,用户可以看到一个Activity且可以和它交互。例如,在新启一个Acitvity和当前Activity不再可见时一般调用onStop()。在这两个方法之间,需要保留维持当显示activity时需要的资源。比如,在onStart()中可以注册一个BroadcastReciver去监听影响UI刷新的变动,当用户在看不到显示的信息时,在onStop()中注销掉对应的广播。

         (3)Activity在前台运行的时间是在调用onResume()和调用onPause()之间,在这段时间里,Activity是在其它屏幕上所有的Activity之前,用户有操作焦点,如输入等。一个Activity经常在前台变换,比如,当手机休眠或者有一个对话框显示时需要调用onPause()。因为,经常出现这种变换,在这两方法的代码实现上作一个轻量级变换,以防止状态变幻时造成用户过长的等待。

         下图表示了这些状态之间切换的路劲和状态之间的循环。其中巨型表示当状态切换时,可以通过重写这些回调函数来做一些自己需要的功能的函数。

   
             

          上图中,可以看到执行onPause()和onStop()时都可能存在Activity的进程被系统杀死,而onPause()又是生命周期中第一可能被杀死的地方,所以一版在onPause()完成一些持久数据的保存,如用户编辑的数据。当然,为了保证各个状态间切换和良好的用户体验,还是需要在onPause()保留一些必须的信息。

          3.保存activity状态:

            之前提到过在Activity调用onPause()和onStop()时,Activity的状态保存,因为只要Activity存在于内存中,它的状态和成员信息都依然存在。当Activity回到前台时,用户在Activity的任何改变都会保留。

           然而当,当系统销毁一个Activity而释放内存时,Activity对象被销毁,导致系统不能简单的回复它和它中信息和状态。相反,如果用户重新启用它,系统需要重新创建一个Activity对象。然而,用户并不知道系统销毁它,并重新创建了一个Activity,但是用户还是希望Activity是正确的以前一样。在这种情况下,需要通过实现一个附件的回调函数去保存Activity重要的信息和状态。这个方法就是:onSaveInstanceState()。

             系统会在Acitvity受到到破坏之前调用onSaveInstanceState(),系统通过一个 Bundle对象,通过键-值对保存信息。一旦系统杀死你的应用程序,用户重新启动Activity,系统会重新通过Bundle使用onCreate()和onRestoreInstanceState()去重新创建一个含有之前信息和状态的Activity。通过使用onRestoreInstanceState()可以从Bundle中提取到保存在Bundle中的Activity之前的状态。如果没有信息恢复,Bundle会传一个空值(这种情况一般发生在第一次创建Activity)。

           下图表示两种方法返回一个完整状态的用户焦点:(1)Activtiy被销毁,需要通过回复之前保存的状态来重新创建Activity;(2)Activity被停止,直接恢复,Activit的状态也是完整的。

             

            然而,即时没在程序中自己没有实现 onSaveInstanceState(),一些Activity会通过默认的 onSaveInstanceState()来恢复状态。几乎所有的组建在framework中都已经实现了onSaveInstanceState(),以致任何UI变动在重新创建时都会自动保存和回复。比如一个EditText,用户输入的任何数据都会被保存,需要我们提供一下组建的ID(adroid:id="@+id/xxx"),如果不提供则无法保存。

            通过使用的默认方法onSaveInstanceState()保存有用的信息,当然也可以重写此方法增加一些其他信息的保存,这个视自己的情况而定。当然也可以通过android:saveEnabled 或setSaveEnabled()来设置组建是否需要保存信息和状态,默认值为true。

           onSaveInstanceState()是用来保存活动的瞬态,而不要用来保存一些持久的数据。相反地,可以在onPause()中保存持久的数据(如保存到数据库中)。

           在应用开发中一般用横竖屏切换来验证程序是否可以恢复切换前的信息和状态。


         4.处理配置变更:

             在程序运行时经常会出现设备的配置变化:如,横竖屏切换、语言变化、键盘可用性等,这些变更一旦发生,系统将会重新创建Activity,系统将立即执行onDestroy()和onCreate()。这一设计有助于应用程序去适应配置的变化,重新计算和加载应用程序提供的资源,如,不同的layout在横竖屏下不同尺寸。

            最好的方法去处理重启activity是:调用onSaveInstanceState()去保存状态,调用onRestoreInstanceState()或onCreate()去回复Activity的状态和数据。


         5.Activty与Activity直接的协调运行:

             (1)当一个Activity启动另一个Activity时,它们都在经历生命周期各个状态的之间的切换。第一个Activity暂停(Pause)或者停止(Stop),或者尽管没有停止却任在后台可见,另一个Activity将被创建(onCreate),在这种情况下,在第二个Activity没有被创建前,第一个Activity还没有完全的停止,第一个Activity会将共享的数据保存在硬盘或其他地方。相反,启动第二个Activity的进程与停止第一个Activity的进程是重叠的。

            (2)当两个Activity在同一个进程中,一个启动另一个时,生命周期的回调是被定义好的。例如:A Activity启动 B Activity

                   a.A 的onPause()方法被执行

                   b.B的onCreate()、onStart() 和onResume()方法依次被执行,B拥有用户焦点。

                   c.如果A不再屏幕上可见,则执行A的onStop()。

                 这种可以预测的生命周期的回调,允许开发者管理数据从一个Activit交换到另一个Activity。比如:必须要在A的onPause方法中将数据保存到数据库中,以方便B读取相应的数据,而不是在onStop()中去保存。


           


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值