您的位置:首页 > 移动开发 > Android开发

Android基础知识三(Activity生命周期)

2017-12-15 16:53 148 查看
今天第一次去参加校园招聘,没有接触到任何技术知识,可能因为平台比较低,感觉:“不是买脑子,只是单纯的卖肉”各种霸王条款... ...

不论怎样都要脚踏实地学习,终会有伯乐来看马~

来记录一下Activity的生命周期

Activity 的生命周期



(1)覆写这些回调函数时,首先要记得一定要调用基类的构造函数。

(2)通过onCreatet()关联出最后的UI,一般做一些初始化的工作。

(3)onStart()只能被父类调用,如果手动调用会出现异常。

(4)onResume()和onPause()中的动作应该互逆,为了保证程序的正确性,在onPause()里应该写上持久层操作的代码,将用户编辑的内容都保存到存储介质上(一般是数据库),同时这个方法里做的事情时间要短,因为下个Activity不会等到这个方法完才启动。
onResume()方法在activity要前台运行的时候执行,比如第一次初始启动后,或者当一个对话框被清除,这是刷新UI的最佳位置,可以在此方法中刷新视图,调用后台线程更新UI。(surfaceCreated()和surfaceChanged()在该方法之后调用)
onPause()方法中,应该取消任何在onResume()方法中所做的事。比如关闭后台线程,释放任何独占方位的资源(如摄像头)。(surfaceDestroy()在该方法后被调用)

(5)onStop()中需要释放某些资源,因为有时系统会kill掉处于onStop()状态的进程,如果资源没有释放,那么可能造成内存泄露。

(6)onStop()中还应该包括一些关闭操作,比如向数据库写信息。

(7)当从onStop()状态回到前景时,首先要调用onRestart(),这个函数做一些恢复工作,恢复停止但是并没有销毁的activity,然后系统会接着调用onStart(),因为activity每次变得可见时都会调用onStart()。

(8)onDestroy()一般会在onPause()和onStop()之后调用,但有一个例外的情况,onCreate()中调用finish()方法,系统会直接调用onDestroy()。

Activity的销毁和重建

(1)
Activity的销毁分为两种:
A)正常的销毁,比如用户按下back按钮或activity自动调用了finish()方法。
B)由于Activity处于onStop()状态,并且长期未被使用,或者前台的Activity需要更多的资源,这些情况下系统就会关闭后台的Activity,以恢复一些内存。
(2)第二种情况下,尽管实际的Activity实例已经被销毁,但是系统仍记得它的存在,因此返回它的时候,系统会创建出一个新的实例来代替它,这里需要用旧的实例被销毁时存下来的数据。
(3)缺省状态下,系统会把每一个View对象保存起来,如果Activity实例被销毁和重建,那么不需要你编码,layout会自动恢复到以前的状态。
(4)当需要存储额外的信息,必须自己实现onSaveInstanceState(Bundle),要记得调用基类的实现。



(5)由于onCreate()和onRestoreInstanceState()回调函数都会接到这个Bundle,通过在onCreate()中检查savedInstanceState是否为空,可以判断是否有需要恢复的状态,同时也可以覆写onRestoreInstanceState(),这个函数在onCreate()之后调用(并且只有Bundle不为null时才会被调用)。



( 6)onSaveInstanceState方法的执行有下面几种情况:
A)当用户按下home键。
B)长按home键,选择运行其他程序。
C)按下电源按键(关闭屏幕显示时)。
D)从activity中启动一个新的activity。
E)屏幕方向切换时,例如从竖屏切换到横屏。
(7)onRestoreInstance被调用的前提是,activity确实被销毁了,而如果仅仅是停留在有可能这种情况下,则该方法不会被调用。例如,当正在显示界面的情况下,按下home键,然后用户紧接着回到界面,则该方法不会被执行。

 
Activity启动模式
(1)standard模式:默认模式,可以不用写配置。在这个模式下,都会默认创建一个新的实例。因此,在这种模式下,可以有多个相同的实例,也允许多个相同Activity叠加。
(2)singleTop模式:可以有多个实例,但是不允许多个相同Activity叠加,即如果Activity在栈顶的时候,启动相同的Activity,不会产生新的实例,而会调用其onNewIntent方法。
(3)singleTask模式:只有一个实例。在同一个应用程序调用它的时候,若Activity不存在,则会在当前task创建新的实例。若存在,则会把task中在其上的其他Activity destroy掉并调用它的onNewIntent方法。

如果是在别的程序中启动它,则会新建一个task,并在该task中启动这个Activity。
(4)singleInstance模式:只有一个实例,并且这个实例单独运行在一个task中,这个task只有这个实例,不允许有别的Activity的存在。

 
Activity退出

(1)通过单例模式把每个Activity的引用添加到一个全局链表中,每次退出程序时,将List中的所有的Activity一个一个地关闭。

(2)在每个Activity创建时给Activity注册一个广播器,当退出时发送该广播即可。
横竖屏切换时候Activity的生命周期Activity退出
A)不设置Activity的anroid:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次。
B)设置Activtiy的android:configChanges=”orientation”时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次。
C)设置Activity的android:configChanges=”orientation|keyboardHidden”时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: