第一行代码学习笔记——活动的生命周期(四)

前言

  虽然我们能够正确的创建一个活动,并在活动之间传递数据,但是我们仍需要对活动了解更加的深入才能够在将来实际应用中更加的得心应手。通过上次实现的两个活动之间的跳转,我们发现android中的活动是堆栈式进行存放的,因为我们在从一个活动跳转到下一个活动时,通过按下Back就能够回到上一个活动。


正文

  通过书中介绍,我们知道了Android是通过Task来管理活动,而每个Task就是按照栈的存放方式的活动的集合。,这个栈也被称作返回栈。在之前我们通过调用finish()来关闭当前的活动,这样处于栈顶的活动就会出栈,然后前一个入栈的活动就会处于栈顶,系统即就将处于栈顶的活动呈现给用户。

  • 活动状态
    每个活动在生命周期中可以处于四种状态:
      1. 运行状态:当一个活动处于栈顶时,该活动就是在运行状态。在该状态下,活动可以最大程度保证不会被系统回收。
    因为活动现在是能够被用户之间看到的,这时候系统是不能够将该活动回收,否则就会对使用体验造成影响。
      2. 暂停状态:当一个活动不处于栈顶,但是还可见时,该活动就处于暂停状态。该状态下,活动也不易被系统回收,因为该活动仍然能够被用户看到,所以除非是系统内存不足时,是不会将该状态的活动回收的。
      3. 停止状态:当活动既不处于栈顶,且不可见时,该活动就会处于停滞状态。当我们通过一个活动跳转至另一个活动时,如果新生成的活动能够将上一个活动完全遮住,那么上一个活动就会处于不可见状态,这时候上一个活动就会调用onStop()。
      4. 销毁状态:当活动不处于返回栈时,就处于销毁状态。这个时候的活动很容易就会被系统所回收。
  • 活动的生存期
    Activity中定义了7个回调方法,来覆盖活动生命周期的每个环节。
    下面基本上基本上是从书上重新抄了一遍,以后温习的时候可以看看。
      onCreate():该方法在创建活动时被调用,我们通过复写该方法,来对活动进行事件绑定,布局绑定等初始化操作;
      onStart():当活动从不可见变为可见状态的时候,就会调用该方法;
      onResume():在活动准备好的时候就会调用该方法,且活动一定处于运行状态;
      onPause():系统准备启动或者回复另一个活动时候调用该方法,可以在该方法下将一些耗费CPU的资源释放掉,但是一定要在短时间内完成,否则会影响新的栈顶活动的使用;
      onStop():当活动完全不可见的时候会调用此方法;
      onDestroy():当活动将要被销毁时调用,使用过该方法后的活动就处于销毁状态;
      onRestart():活动在由停止状态变为运行状态之前调用该方法;
    通过上述的方法,我们可以将活动分为三种生存期:
      完整生存期:活动从onCreate()onDestroy()之间所经历的就是完整生存期。在此期间,onCreate()将对活动完成各种初始化操作,而onDestroy()则释放活动所占用的内存。
      可见生存期:活动从onStart()onStop()之间所经历的就是可见生存期。当处于这个期间时,活动对于用户来说总是可见或者部分可见的,但是可能不能与用户交互的。我们在此期间可以完成对资源的加载及释放,这样就可以在活动处于停止状态时不会占用过多的资源。
      前台生存期:活动从onResume()onPause()之间所经历的就是前台生存期。在前台生存期期间,活动是处于运行状态的,在这个状态下的活动可以与用户交互。
      活动的生命周期如下图所示:
    这里写图片描述
    如果由于内存限制必须将一些活动回收,而我们在活动中有一些数据仍需要使用,那么我们可以使用onSaveInstanceState(Bundle outState),该方法在活动被系统回收的时候一定会调用该方法,我们仅需要将需要保存的数据以键值的形式传入该方法的Bundle参数中,这样就能够活动下次重新创建的时候,继续使用这些数据,通过onCreate(savedInstanceState)的参数Bundle就能够重新得到所需的数据。
  • 活动的启动模式
    启动模式是针对实际开发中对活动的不同需求,来决定活动的实例在返回栈中只存在一个,还是有多个实例,通过给<Activity>下指定android:launchMode来确定该活动使用哪种启动模式,而启动模式又分为四种,分别是:standard, singleTop, singleTask和singleInstance,而其中standard就是我们平常所使用的启动模式,当我们没做一次活动之间的跳转,就会生成一个新的活动实例,不论在返回栈中是否已经存在了该类实例。那如果我们需要当活动处于运行状态时不需要生成另一个同类实例,我们就将该活动的启动模式设为singleTop,就能够保证在活动处于栈顶且可见时能够不出现同类实例。当我们需要一个活动的实例在返回栈中只出现一次,不论该活动是否处在栈顶,我们可以将该活动的启动模式设为singleTask,那么在返回栈中,进会存在一个该类实例,当我们要跳转到该类的时候,系统就会优先选择返回栈中存在的该类实例,并将该实例置于栈顶,而该实例之上的所有活动就将被弹出返回栈,这一启动方式非常适合用来做主页的活动,因为我们只需要一个主页实例。最后一个是singleInstance,这一启动方式是为了方便该活动能够自由的被我们的程序和其它的程序共享,也就是说,在这种启动模式下的活动,会被单独放置在一个返回栈之中,不受其它活动的影响。

活动章节的最后一部分

在这一章的最后部分,介绍了三种非常实用的方法,虽然对于现在来说应该是“烂大街”的内容,但仍旧值得我们去学习。(其实是因为这本书被广泛的传播和阅读,很多人也应该知道了,但是既然是做笔记,那我还是会把这一部分加在后面)

  • 知晓当前是在哪一个活动
    新建BaseActivity类,通过继承AppCompatActivity,并在onCreate()方法中加入获取该类名称,并将其打印到日志,然后让之前继承AppCompatActivity的活动继承我们新建的类,就可以实现目的。
  • 随时随地的退出程序
    通过新建一个Manager类,每当创建一个新的活动实例,也就是活动回调了onCreate()方法的时候,就将该实例放入Manager类之中,而当活动将要被销毁的时候,也就是回调方法onDestroy()中,将该实例从Manager中移除,当我们需要一键退出程序的时候,将其保存的所有活动实例调用finish()即可。
  • 启动活动的最佳实践
    由于在实际的开发后动中,我们不可能开发到每一个活动,而当我们需要向另一个并不是我们自己所编写的活动传递Intent的时候,是要发送哪些关键的数据呢?一般这个时候我们需要去询问开发该活动的人,或者自己通过观察源码来知晓应该传递什么数据。这无疑会降低开发的效率,这时候我们可以在活动中单独加入一个actionStart()方法,为该方法传入所需的数据,然后存储在Intent中,进而启动该活动。这样的好处就是当我们需要传递信息给一个未知的活动的时候,仅需要看actionStart()部分的代码既可以确定应该如何对接交互部分,大大提高效率。

课后总结

当看完了这一章的内容后,着实感到作者的用心良苦,为了让从零开始的人能够顺利走上android开发道路,精简了很多部分的内容,而不是堆砌大量的知识点。好处就是让读者不会在一开始就感到过大的压力,坏处就是……真的,往回看后感觉内容略显单薄,所以如果能够自己单独去补充相关的知识,就能够补充自己知识储备不足的问题。
那么这一节过后,活动的内容就结束了,接下来就要学习UI组件相关的内容。
希望和我同处于这个阶段的同学,能够共勉,克服难关。


参考文章或工具

UML流程图:ProcessOn

上一节内容:第一行代码学习笔记——活动之间的交互,Intent(三)
下一节内容:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值