手记

Android四大组件之Activity

1.Activity生命周期

Activity状态

上图是官方给出的Activity生命周期图,Activity有三种状态:

1.Resumed:此时Activity处于前台,拥有用户焦点,可与用户交互,也就是通常意义上的运行中。
2.Paused:字面意思是暂停的,你可以想象,有另外一个Activity在前台并拥有焦点,但是Paused Activity仍然可以被看见,只是被遮挡了一部分或者是可以通过透明的一个层面被看到。这样的Activity一定是活动的,而且各种信息状态都保存得好好地。不过在极端缺少内存的情况下可能会被系统杀掉。
3.Stopped:停止的,此时Activity完全不可见,处于后台,可能是活动的,也就是还处于内存中,此时Acitivity对象存在而且状态和成员信息都还在,也可能在任何时候当系统需要内存的时候被杀掉。

如果一个Activity是Paused或者Stopped,它就可能会被系统用finish()方法或者直接杀进程的方式来消灭。既然我们不知道什么时候会被杀掉(毕竟用户的行为很难预测,甚至有时候他会拔电池,如果你以为Paused状态还算安全,没保存信息的话..),那么就要在之前做好应对措施。

具体来说各个状态的时机,对着上面的生命周期图从绿色的running开始一圈一圈扩散就是了。onResume()是进入Resumed的时候被调用(以下“被调用”就省略了,这些方法都是系统调用,你需要在其中填入调用时需要做的事情,例如更新文字等等),onPause()标志着离开Resumed。再向外,onStart()标志进入Paused,onStop()是退出进入Stopped状态了,onCreate()是从Stopped状态离开进入Paused。onDestroy()是系统摧毁Activity的时候。

生命周期回调函数的使用

各阶段通常应该做的事:
*生命周期的全程,应该是onCreate()到onDestroy()。通常你应该在onCreate()中设置好全局状态成员等,例如定义layout初始化view。onDestroy()中释放所有资源。例如如果你的Activity需要有一个线程在后台运行,来下载数据的话,应该在onCreate中创建,在onDestroy中停止。

*生命周期的可见阶段,是onStart到onStop,也就是Pasued和Resumed,被其他Activity遮蔽一部分或者自己在前台。在这个阶段,你需要保持展示给用户的资源。例如你可以在onStart中注册BroadcastReceiver来监测对于UI有影响的变化,在onStop中取消注册。onStart和onStop在整个生命周期中可能会被调用很多次,如果用户来回切换的话。

*生命周期的前台阶段,就是Resumed时期。这段时间的两个函数可能会被频繁调用,因为像出现一个对话框这种程度都会调用切换到Paused。所以这里的代码必须轻量化。在onPasue()中通常可以提交未保存的信息、停止动画,以及其他消耗CPU的活。

其中从onPasue开始,系统随时可能杀死Activity。所以onPasue是最后一个能确保执行的函数。后面两个函数可能不会被执行。所以onPasue中你需要保存一些的确需要保持的信息,如用户的编辑。但是注意不要做过多的事,那样可能会造成卡顿影响用户体验。

保存状态

你可能已经注意到了,生命周期图中有一个onRestart()我还没介绍。实际上系统为了保存Activity的状态,有自己的方法。系统使用的是onSaveInstanceState(),这个方法并不是Activity生命周期里的,并不一定会触发。只有当意外情况下,如内存不足或者用户直接按Home键,之后系统需要销毁Activity的时候才会被调用。而用户主动销毁Activity时,最常见的状况就是用户使用返回键来推出App时,此方法不会调用。因为用户主动退出表示用户不需要保存状态。这种区别决定了onSaveInstanceState()适合保存一些临时性的状态,而onPause()适合保存持久化的数据。

用户的使用有三种情况:

1.Activity被切换出去(Home键或者其他Activity上位),系统会在onStop()之前,调用onSaveInstanceState(),但是它与onPause()的先后不确定。之后Activity进入后台,如果Acitivity在没被杀掉之前再次与用户交互,系统会调用onRetart()->onStart()->onResume(),此种情况下你的Activity状态一直在内存中,系统没有必要恢复数据

2.Activity被切换出去(Home键或者其他Activity上位),系统会调用onSaveInstanceState(),之后Activity进入后台,如果Acitivity在什么时候被杀掉,然后用户又需要使用它,系统会调用onCreate()/onRestoreInstanceState()->onStart()->onResume(),此种情况下你的数据会在onSaveInstanceState()被存储,在onCreate()/onRestoreInstanceState()中恢复

3.Acitivity被用户使用返回键退出,用户手动销毁。不会调用onSaveInstanceState(),系统不会存储任何东西。

看到这儿你可能想自己去在onSaveInstanceState()中保存些数据了。那么具体是怎么存储地呢?
自己创建一个Activity就可以看到,onCreate的默认实现是这样的:

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

这个saveInstanceState就是onSaveInstanceState()保存的东西了,可以看到它是一个Bundle,Bundle类似于一个字典,你可以储存一些键值对进去,比如用putString()或者putInt()。储存的Bundle会传入onCreate()/onRestoreInstanceState()作为参数,上面的代码就是Bundle被传到了onCreate()。

可以看到默认的会调用一个super.onCreate(savedInstanceState),这暗示了除了你手动来保存数据,系统的默认行为也会保存些数据。系统会默认保存界面上View的信息,Android框架中几乎所有view都实现了这个功能。例如,EditText会储存用户输入的文字,但是如果要实现这个功能,你需要为这个view设置一个id,没有id的view状态不会被保存。
如果想显式地停止view的自动保存,可以设置android:saveEnabled为false或者调用setSaveEnabled()。

Activity交接

如果从A Activity中跳转到B Activity,A会到后台,而B会被创建。两者的生命周期是有重合的,A还未进入后台B就开始创建了。如果A和B是同一进程中的Activity,那么会有以下的顺序:

1.A的onPause()执行,A失去用户焦点
2.B的onCreate(),onStart(),onResume()执行,B获得用户焦点
3.如果A不可见了,那么A的onStop()调用,进入后台

这个固定的顺序有助于你处理activity之间的信息传递,例如如果你需要在A结束的时候写入数据到数据库,在B中读取数据库,那么你应该在onPause()中写入数据而不是onStop()。

2.Fragment生命周期

Fragment有自己的生命周期,相当于一个微型的Activity。Fragment的生命周期受所属的Activity生命周期影响,与其同步。如果activity被paused,fragment也被paused。不过当一个activity运行的时候,你可以独立地控制各个fragment,添加或者移除他们。你也可以将其加入activity控制的回退栈,使得用户能用back键返回上个fragment。

fragment同样具有activity的三个阶段,resumed,paused,stopped

Resumed: 在运行中的Acitivity中可见
Paused:此fragment所处的Activity被部分遮挡
Stopped:fragment不可见,宿主Activity被Stopped或者fragment被压入回退栈,fragment仍然存活,但是如果Activity被杀,fragment也会被杀。

Fragment也会用Bundle保存状态,你可以在onSaveInstanceState()中保存数据,在onCreate(), onCreateView()或者onActivityCreated()中恢复。

Fragment生命周期与Activity最大的区别是如何处理回退栈。Activity在进入后台时会被压入由系统维护的回退栈,这样用户就能用Back按钮返回上一个Activity。但是Fragment只有当你在宿主Activity中显式地调用addToBackStack(),它才会被压入Activity维护的回退栈。

Fragment生命周期中的与Activity相同的回调函数是与Activity的生命周期同步的。我们来看看几个没出现过的函数:
1.onAttach():Fragment与Activity绑定的时候被调用(Activity被传到这里)
2.onCreateView():Fragment生成View时被调用
3.onActivityCreated():宿主Activity的onCreate()返回的时候被调用
4.onDestroyView():Fragment的View移除时被调用
5.onDetach():Fragment与宿主Activity解绑的时候被调用

在Activity resumed状态你可以自由的添加/移除fragment。所以只有在resumed状态fragment们的生命周期才会独立地改变。其他状态下Fragment的生命周期都是取决于Activity。

各阶段需要做的事和Activity大致相同。需要注意的是在onCreateView()中必须返回fragment的layout给系统,以绘制fragment的UI。通常需要传入fragment的layout文件,如R.layout.fragment_layout。

原文链接:http://www.apkbus.com/blog-705730-61042.html

0人推荐
随时随地看视频
慕课网APP