前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >第1章-Activity的生命周期和启动模式(上)

第1章-Activity的生命周期和启动模式(上)

作者头像
程序亦非猿
发布2019-08-16 14:31:24
4120
发布2019-08-16 14:31:24
举报
文章被收录于专栏:程序亦非猿程序亦非猿

好久没发了,发一篇艺术探索的学习笔记,冒个泡 以前都记在本子上,现在挪到电脑上了 又是一个系列,一个坑 由于是笔记,所以只记录了部分,见谅!~ 不过也加上了自己的一些笔记,所以还是值得一看的

Activity的生命周期

  1. 正常状态
  2. 异常状态(系统杀死/Configuration变化如屏幕旋转)

正常状态

  1. onCreate 表示Activity正在创建,可以做一些初始化操作
  2. onRestart 正在重新启动,onstop后回来会调用
  3. onStart 正在被启动,后台,不可交互
  4. onResume 可见可交互前台,非常重要,许许多多的重要的类在这里初始化
  5. onPause 正在停止 后台(不一定不可见) 不可做太耗时的操作,因为onPause之后新启动Activity的onResume才能被调用
  6. onStop 即将停止,不可见 可以做一些稍微重量级 的回收
  7. onDestroy 即将销毁,可以做一些回收资源,关闭线程,移除Handler消息等操作

生命周期配对去记忆效果更佳: create — destroy start — stop resume — pause

注意点:

A 启动 B 如果B是透明的Activity,那么A的onStop不会被调用

异常状态

Activity的销毁与重建涉及到这两方法:

  1. onSaveInstanceState(@Nullable Bundle state) 系统会调用它来保存状态,以便之后恢复
  2. onRestoreInstanceState(@NonNull Bundle state) 为系统恢复所用

当Activity将处于可能被销毁或要被销毁的状态,就会调用onSaveInstanceStateonRestoreInstanceState则是重建的时候被调用

调用时机

onSaveInstanceStateonStop之前调用,而不一定在onPause之后 onRestoreInstanceStateonStart之后,onResume之前

所以,大致的完整的生命周期是这样的: onCreate onRestart onStart onRestoreInstanceState onResume onPause onSaveInstanceState onStop onDestroy

PS:onSaveInstanceState如下情况会调用:

  1. 启动了新的Activity
  2. 按了Home键等等

另外:可以在onCreate里判断bundle是否为null来判断是新建还是重新创建

View 的恢复

A系统默认做了一定的恢复,如视图结构,LV的滑动的位置等等(View也有save,restore方法)

代码语言:javascript
复制
> PS 看到有的文章说解决Fragment重叠的问题,就是注释掉Activity的onSaveInstanceState方法,简直是误人子弟!!!有机会以后讲    

扯远了,保存和恢复View的层次结构,系统的工作流程是这样子的: Activity⇒Window⇒DecorView⇒ContentView⇒View 一层一层委托保存恢复状态

Activity优先级

  1. 前台Activity 正在交互的,onResume状态的Activity
  2. 可见但非前台,弹了Dialog,依然可见但是不能交互
  3. 后台Activity ,执行onStop之后

Configuration 改变

Configuration改变的时候系统默认会重建Activity,如果我不想重建,那么可以选择配置android:configChanges属性,一般常用的就orientation,screenSize,keyboardHidden

so,一般给Activity配上这个就行了: android:configChanges="orientation|screenSize|keyboardHidden"

启动模式

Standard

标准模式,默认的启动模式,每次启动都会新建一个Activity实例

需要注意的是当使用ApplicationContext去启动Standard模式的Activity的时候会报错,说需要添加NEW_TASK 的标记

为什么呢?

因为Activity启动需要任务栈,而用Standard模式去启动Activity,默认会进入启动它的Activity所属的任务栈中,而非Activity类型的Context并没有所谓的任务栈.

ABC—启动C->ABC

SingleTop

栈顶复用模式,如果新的Activity已位于栈顶,那么不会重新创建Activity,而是回调onNewIntent方法

onNewIntent-->onResume

ABC—启动C→ ABC

SingleTask

栈内复用模式,只要占中存在都不会重新创建,并且也是回调onNewIntent 另外需要注意的是,该模式拥有clearTop 的效果,会把位于它顶上的Activity全部出栈(PS:必须同一个栈)

如: ABCDE—启动C(SingleTask)→ ABC

SingleInstance

单实例模式,栈内单例,一个Activity实例独占一个任务栈,可以说整个手机都只有一个实例

指定启动模式有两种方式:

  1. 清单里修改android:launchMode属性
  2. Intent.addFlags() 来指定
Activity的Flags

常用的Flags:

  1. FLAG_ACTIVITY_NEW_TASK 指定启动模式为singleTask
  2. FLAG_ACTIVITY_SINGLE_TOP 指定singleTop启动模式
  3. FLAG_ACTIVITY_CLEAR_TOP 将在它之上的所有Activity移出栈,这个模式一般需要和FLAG_ACTIVITY_NEW_TASK一起出现
  4. FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS 具有这个标记的Activity不会出现在历史Activity列表中,相当于android:exludeFromRecents="true"

任务栈

TaskAffinity(任务相关性),标识了一个Activity的任务栈名称,默认为应用的包名(万能的包名啊!)

我们可以在清单文件里配置,也可以为每个Activity配置不同的值,但是需要注意的是它不能跟包名相同,并且必须要包含.分隔符!

并且TaskAffinity属性主要和SingleTask或者allowTaskReparenting配对使用,在其他情况下没有意义.

  1. TaskAffinity和SingleTask配合: TaskAffinity的值为该模式的任务栈的名字
  2. TaskAffinity和allowTaskReparenting 配合就比较复杂了: 当allowTaskReparentingtrue时,A应用启动B应用的一个Activity C,然后按Home回到桌面,然后再单击B的桌面图标,这个时候不是启动B的主Activity,而是重新显示被应用A启动的Activity C(原本来说C是A启动的,那么C应该待在A的任务栈里),或者说C从A的任务栈转移到了B的任务栈中(也许这就是re-parenting的含义吧)

补充:allowTaskReparenting需要和FLAG_ACTIVITY_RESET_TASK_IF_NEEDED标记合作才行,而从Home点击图标启动应用的Intent就带有该标记.

预告下一篇应该是 IntentFilter的匹配规则,为什么不放一起呢?

一来是字数太多,二来是我还没打完...

EJ系列的坑还没填完,我又开了一个坑...

我都想打死我自己

关注我,看我把坑填完!

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-05-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序亦非猿 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Activity的生命周期
    • 正常状态
      • 异常状态
        • 调用时机
        • View 的恢复
      • Activity优先级
        • Configuration 改变
        • 启动模式
          • Standard
            • SingleTop
              • SingleTask
                • SingleInstance
                  • Activity的Flags
              • 任务栈
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档