[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MhPkxLFA-1638250133902)(https://user-gold-cdn.xitu.io/2019/10/30/16e1ab263d2eccd9?imageView2/0/w/1280/h/960/ignore-error/1)]

一、生命周期


  • 先贴一张闻名遐迩的图
  • 我们生命周期先看看具体有哪些方法回调,在逐一攻破:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4LgvS4dZ-1638250133972)(https://user-gold-cdn.xitu.io/2019/10/30/16e1ab263d483f3c?imageView2/0/w/1280/h/960/format/png/ignore-error/1)]

1.1 Dialog 弹出时

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1Lfsa44K-1638250133972)(https://user-gold-cdn.xitu.io/2019/10/30/16e1ab2640bfa92b?imageView2/0/w/1280/h/960/ignore-error/1)]

  • 如果是单纯是创建的 dialogActivity 并不会执行生命周期的方法
  • 但是如果是跳转到一个不是全屏的 Activity 的话, 当然就是按照正常的生命周期来执行了
  • onPasue() -> onPause() ( 不会执行原 ActivityonStop() , 否则上个页面就不显示了 )

1.2 横竖屏切换时

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Asuj5Fy3-1638250133973)(https://user-gold-cdn.xitu.io/2019/10/30/16e1ab2640d09989?imageView2/0/w/1280/h/960/ignore-error/1)]

  • 不设置 Activityandroid:configChanges 时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次

  • 设置 Activityandroid:configChanges="orientation" 时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次

  • 设置 Activityandroid:configChanges="orientation|keyboardHidden" 时,切屏不会重新调用各个生命周期,只会执行 onConfigurationChanged 方法

  • 注意:还有一点,非常重要,一个 Android 的变更细节!当 API >12 时,需要加入 screenSize 属性,否则屏幕切换时即使你设置了 orientation 系统也会重建 Activity

  • 横竖屏切换生命周期的执行

1.3 不同场景下 Activity 生命周期的变化过程

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LBgOJE2e-1638250133974)(https://user-gold-cdn.xitu.io/2019/10/30/16e1ab2662135b32?imageView2/0/w/1280/h/960/ignore-error/1)]

  • 启动 ActivityonCreate() —> onStart() —> onResume()Activity 进入运行状态。
  • 锁屏时会执行 onPause()onStop() , 而开屏时则应该执行 onStart() onResume()

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fv2dYxGY-1638250133975)(https://user-gold-cdn.xitu.io/2019/10/30/16e1ab2662bc3f51?imageView2/0/w/1280/h/960/ignore-error/1)]

  • Activity 退居后台: 当前 Activity 转到新的 Activity 界面或按 Home 键回到主屏: onPause() —> onStop() ,进入停滞状态。
  • Activity 返回前台: onRestart() —> onStart() —> onResume() ,再次回到运行状态。
  • Activity 退居后台: 且系统内存不足, 系统会杀死这个后台状态的 Activity ,若再次回到这个 Activity ,则会走 onCreate() --> onStart() —> onResume()

1.4 将一个 Activity 设置成窗口的样式

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-usHDGg5X-1638250133976)(https://user-gold-cdn.xitu.io/2019/10/30/16e1ab2666b5baec?imageView2/0/w/1280/h/960/ignore-error/1)]

只需要给我们的 Activity 配置如下属性即可。 android:theme="@android:style/Theme.Dialog"

1.5 退出已调用多个 Activity 的 Application

  • 通常情况用户退出一个 Activity 只需按返回键,我们写代码想退出 activity 直接调用 finish() 方法就行。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rUr4o6gg-1638250133976)(https://user-gold-cdn.xitu.io/2019/10/30/16e1ab2668399456?imageView2/0/w/1280/h/960/ignore-error/1)]

  • 发送特定广播:
  1. 在需要结束应用时, 发送一个特定的广播,每个 Activity 收到广播后,关闭 即可。
  2. 给某个 activity 注册接受接受广播的意图 registerReceiver(receiver, filter)
  3. 如果过接受到的是 关闭 activity 的广播 activity finish()
  • 递归退出
  1. 就调用 finish() 方法 把当前的 Activity 退出
  2. 在打开新的 Activity 时使用 startActivityForResult , 然后自己加标志, 在 onActivityResult 中处理, 递归关闭。
  • 其实
  1. 也可以通过 intentflag 来实现 intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP) 激活一个新的 activity
  2. 此时如果该任务栈中已经有该 Activity , 那么系统会把这个 Activity 上面的所有 Activity 干掉。
  3. 其实相当于给 Activity 配置的启动模式为 singleTask
  • 记录打开的 Activity
  1. 每打开一个 Activity , 就记录下来。
  2. 在需要退出时 , 关闭每一个 Activity

1.6 锁定屏与解锁屏幕,Activity 如何执行生命周期

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ouxwuq3t-1638250133977)(https://user-gold-cdn.xitu.io/2019/10/30/16e1b5f0ff6a9d15?imageView2/0/w/1280/h/960/ignore-error/1)]

  • 锁屏时会执行 onPause()onStop() , 而开屏时则应该执行 onStart() onResume()

1.7 修改 Activity 进入和退出动画

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nhpuA3T4-1638250133977)(https://user-gold-cdn.xitu.io/2019/10/30/16e1ab2666eae897?imageView2/0/w/1280/h/960/ignore-error/1)]

  • 可以通过两种方式 , 一是通过定义 Activity 的主题 ,二是通过覆写 ActivityoverridePendingTransition 方法。
  • 通过设置主题样式在 styles.xml 中编辑代码 , 添加 themes.xml 文件:在 AndroidManifest.xml 中给指定的 Activity 指定 theme
  • 覆写 overridePendingTransition 方法:overridePendingTransition(R.anim.fade, R.anim.hold);

1.8 Activity 的四种状态

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HEEcdtOP-1638250133978)(https://user-gold-cdn.xitu.io/2019/10/30/16e1ab26844b8ee7?imageView2/0/w/1280/h/960/ignore-error/1)]

  • runnig :用户可以点击,activity 处于栈顶状态。
  • pausedactivity 失去焦点的时候,被一个非全屏的 activity 占据或者被一个透明的 activity 覆盖,这个状态的 activity 并没有销毁,它所有的状态信息和成员变量仍然存在,只是不能够被点击。(内存紧张的情况,这个 activity 有可能被回收)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NbytALKT-1638250133978)(https://user-gold-cdn.xitu.io/2019/10/30/16e1ab2687e2a13a?imageView2/0/w/1280/h/960/ignore-error/1)]

  • stopped :这个 activity 被另外一个 activity 完全覆盖,但是这个 activity 的所有状态信息和成员变量仍然存在(除了内存紧张)
  • killed :这个 activity 已经被销毁,其所有的状态信息和成员变量已经不存在了。

1.9 如何处理异常退出

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1ss66F21-1638250133979)(https://user-gold-cdn.xitu.io/2019/10/30/16e1ab268bcbf377?imageView2/0/w/1280/h/960/ignore-error/1)]

  • Activity 异常退出的时候 --> onPause() --> onSaveInstanceState() --> onStop() --> onDestory()
  • 需要注意的是 onSaveInstanceState() 方法与 onPause 并没有严格的先后关系,有可能在 onPause 之前,也有可能在其后面调用,但会在 onStop() 方法之前调用
  • 异常退出后又重新启动该 Activity --> onCreate() --> onStart() --> onRestoreInstanceState() --> onResume()

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZyQ37dS5-1638250133979)(https://user-gold-cdn.xitu.io/2019/10/30/16e1ab268c50ae91?imageView2/0/w/1280/h/960/ignore-error/1)]

  • 搞懂这个生命周期的执行后就可以回答了,首先要知道面试官的意思:是要重新启动并恢复这个 Activity 还是说直接退出整个 app
  • 如果要恢复则要在 onSaveInstanceState() 中进行保存数据并在 onRestoreInstanceState() 中进行恢复
  • 如果是要退出 app 的话就要捕获全局的异常信息,并退出 app
  • 当然个人建议是使用 UncaughtExceotionHandler 来捕获全局异常进行退出 app 的操作,这样会减少之前崩溃所造成的后遗症!

1.10 什么是 onNewIntent

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dFZAbaER-1638250133979)(https://user-gold-cdn.xitu.io/2019/10/30/16e1ab26900d9292?imageView2/0/w/1280/h/960/ignore-error/1)]

  • 如果 IntentActivity 处于任务栈的顶端,也就是说之前打开过的 Activity ,现在处于 onPauseonStop 状态的话,其他应用再发送 Intent 的话

  • 执行顺序为:onNewIntentonRestartonStartonResume

二、启动模式


2.1 启动模式

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Y4ixupu9-1638250133980)(https://user-gold-cdn.xitu.io/2019/10/30/16e1ab2695ac3863?imageView2/0/w/1280/h/960/ignore-error/1)]

  • Activity 一共有四种 launchModestandardsingleTopsingleTasksingleInstance

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eg57Rkhg-1638250133980)(https://user-gold-cdn.xitu.io/2019/10/30/16e1ab26af18ff50?imageView2/0/w/1280/h/960/ignore-error/1)]

  • Standard 模式(默认模式)
  1. 说明: 每次启动一个 Activity 都会又一次创建一个新的实例入栈,无论这个实例是否存在。

  2. 生命周期:每次被创建的实例 Activity 的生命周期符合典型情况,它的 onCreateonStartonResume 都会被调用。

  3. 举例:此时 Activity 栈中以此有 ABC 三个 Activity ,此时C处于栈顶,启动模式为 Standard 模式。若在 C Activity 中加入点击事件,须要跳转到还有一个同类型的 C Activity 。结果是还有一个 C Activity 进入栈中,成为栈顶。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-smSGPLqU-1638250133981)(https://user-gold-cdn.xitu.io/2019/10/30/16e1ab26af2f73ef?imageView2/0/w/1280/h/960/ignore-error/1)]

  • SingleTop 模式(栈顶复用模式)
  1. 说明:分两种处理情况:须要

《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》

【docs.qq.com/doc/DSkNLaERkbnFoS0ZF】 完整内容开源分享

创建的 Activity 已经处于栈顶时,此时会直接复用栈顶的 Activity 。不会再创建新的 Activity ;若须要创建的 Activity 不处于栈顶,此时会又一次创建一个新的 Activity 入栈,同 Standard 模式一样。

  1. 生命周期:若情况一中栈顶的 Activity 被直接复用时,它的 onCreateonStart 不会被系统调用,由于它并没有发生改变。可是一个新的方法 onNewIntent 会被回调( Activity 被正常创建时不会回调此方法)。

  2. 举例:此时 Activity 栈中以此有 ABC 三个 Activity ,此时 C 处于栈顶,启动模式为 SingleTop 模式。情况一:在 C Activity 中加入点击事件,须要跳转到还有一个同类型的 C Activity 。结果是直接复用栈顶的 C Activity。情况二:在 C Activity 中加入点击事件,须要跳转到还有一个 A Activity。结果是创建一个新的 Activity 入栈。成为栈顶。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SeccgeOf-1638250133981)(https://user-gold-cdn.xitu.io/2019/10/30/16e1ab26b234a4cb?imageView2/0/w/1280/h/960/ignore-error/1)]

  • SingleTask 模式(栈内复用模式)
  1. 说明:若须要创建的 Activity 已经处于栈中时,此时不会创建新的 Activity ,而是将存在栈中的 Activity 上面的其他 Activity 所有销毁,使它成为栈顶。

  2. 如果是在别的应用程序中启动它,则会新建一个 task ,并在该task中启动这个 ActivitysingleTask 允许别的 Activity 与其在一个 task 中共存,也就是说,如果我在这个 singleTask 的实例中再打开新的 Activity ,这个新的 Activity 还是会在 singleTask 的实例的 task 中。

  3. 生命周期:同 SingleTop 模式中的情况一同样。仅仅会又一次回调 Activity 中的 onNewIntent 方法

  4. 举例:此时 Activity 栈中以此有 ABC 三个 Activity 。此时 C 处于栈顶,启动模式为 SingleTask 模式。情况一:在 C Activity 中加入点击事件,须要跳转到还有一个同类型的 C Activity 。结果是直接用栈顶的 C Activity 。情况二:在 C Activity 中加入点击事件,须要跳转到还有一个 A Activity 。结果是将 A Activity 上面的 BC 所有销毁,使 A Activity 成为栈顶。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CxmqeXXS-1638250133982)(https://user-gold-cdn.xitu.io/2019/10/30/16e1ab26b197fba4?imageView2/0/w/1280/h/960/ignore-error/1)]

  • SingleInstance 模式(单实例模式)
  1. 说明: SingleInstance 比较特殊,是全局单例模式,是一种加强的 SingleTask 模式。它除了具有它所有特性外,还加强了一点:只有一个实例,并且这个实例独立运行在一个 task 中,这个 task 只有这个实例,不允许有别的 Activity 存在。

  2. 这个经常使用于系统中的应用,比如 Launch 、锁屏键的应用等等,整个系统中仅仅有一个!所以在我们的应用中一般不会用到。了解就可以。

  3. 举例:比方 A Activity 是该模式,启动 A 后。系统会为它创建一个单独的任务栈,由于栈内复用的特性。兴许的请求均不会创建新的 Activity ,除非这个独特的任务栈被系统销毁。

2.2 启动模式的使用方式

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BF8bUyx8-1638250133982)(https://user-gold-cdn.xitu.io/2019/10/30/16e1ab26b281455b?imageView2/0/w/1280/h/960/ignore-error/1)]

  • Manifest.xml 中指定 Activity 启动模式
  1. 一种静态的指定方法
  2. Manifest.xml 文件里声明 Activity 的同一时候指定它的启动模式
  3. 这样在代码中跳转时会依照指定的模式来创建 Activity
  • 启动 Activity 时。在 Intent 中指定启动模式去创建 Activity
  1. 一种动态的启动模式
  2. new 一个 Intent
  3. 通过 IntentaddFlags 方法去动态指定一个启动模式。
  • 注意:以上两种方式都能够为 Activity 指定启动模式,可是二者还是有差别的。
  1. 优先级:动态指定方式即另外一种比第一种优先级要高,若两者同一时候存在,以另外一种方式为准。

  2. 限定范围:第一种方式无法为 Activity 直接指定 FLAG_ACTIVITY_CLEAR_TOP 标识,另外一种方式无法为 Activity 指定 singleInstance 模式。

2.3 启动模式的实际应用场景

这四种模式中的 Standard 模式是最普通的一种,没有什么特别注意。而 SingleInstance 模式是整个系统的单例模式,在我们的应用中一般不会应用到。所以,这里就具体解说 SingleTopSingleTask 模式的运用场景:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0eQnom0Y-1638250133983)(https://user-gold-cdn.xitu.io/2019/10/30/16e1ab26b65bb92a?imageView2/0/w/1280/h/960/ignore-error/1)]

  • SingleTask 模式的运用场景
  1. 最常见的应用场景就是保持我们应用开启后仅仅有一个 Activity 的实例。
  2. 最典型的样例就是应用中展示的主页( Home 页)。
  3. 假设用户在主页跳转到其他页面,运行多次操作后想返回到主页,假设不使用 SingleTask 模式,在点击返回的过程中会多次看到主页,这明显就是设计不合理了。
  • SingleTop 模式的运用场景
  1. 假设你在当前的 Activity 中又要启动同类型的 Activity
  2. 此时建议将此类型 Activity 的启动模式指定为 SingleTop ,能够降低Activity的创建,节省内存!
  • 注意:复用 Activity 时的生命周期回调
  1. 这里还须要考虑一个 Activity 跳转时携带页面參数的问题。
  2. 由于当一个 Activity 设置了 SingleTop 或者 SingleTask 模式后,跳转此 Activity 出现复用原有 Activity 的情况时,此 ActivityonCreate 方法将不会再次运行。onCreate 方法仅仅会在第一次创建 Activity 时被运行。
  3. 而一般 onCreate 方法中会进行该页面的数据初始化、UI 初始化,假设页面的展示数据无关页面跳转传递的參数,则不必操心此问题
  4. 若页面展示的数据就是通过 getInten() 方法来获取,那么问题就会出现:getInten() 获取的一直都是老数据,根本无法接收跳转时传送的新数据!
  • 以下,通过一个样例来具体解释:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-V2aEyZyA-1638250133983)(https://user-gold-cdn.xitu.io/2019/10/30/16e1ab26cff841e2?imageView2/0/w/1280/h/960/ignore-error/1)]

  • 以上代码中的 CourseDetailActivity 在配置文件里设置了启动模式是 SingleTop 模式,依据上面启动模式的介绍可得知,当 CourseDetailActivity 处于栈顶时。

  • 再次跳转页面到 CourseDetailActivity 时会直接复用原有的 Activity ,并且此页面须要展示的数据是从 getIntent() 方法得来,可是 initData() 方法不会再次被调用,此时页面就无法显示新的数据。

  • 当然这样的情况系统早就为我们想过了,这时我们须要另外一个回调 onNewIntent(Intent intent)方法。此方法会传入最新的 intent ,这样我们就能够解决上述问题。这里建议的方法是又一次去 setIntent 。然后又一次去初始化数据和 UI 。代码例如以下所看到的:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HUuiVmhR-1638250133983)(https://user-gold-cdn.xitu.io/2019/10/30/16e1ab26f4794839?imageView2/0/w/1280/h/960/ignore-error/1)]

  • 这样,在一个页面中能够反复跳转并显示不同的内容。

2.4 快速启动一个 Activity

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FPqqDN0Y-1638250133984)(https://user-gold-cdn.xitu.io/2019/10/30/16e1ab26f46155c8?imageView2/0/w/1280/h/960/ignore-error/1)]

  • 这个问题其实也是比较简单的,就是不要在 ActivityonCreate 方法中执行过多繁重的操作,并且在 onPasue 方法中同样不能做过多的耗时操作。

2.5 启动流程

  • 注意!这里并不是要回答 Activity 的生命周期!

  • 3 分钟看懂 Activity 启动流程

2.6 Activity 的 Flags

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yO7zSwqE-1638250133984)(https://user-gold-cdn.xitu.io/2019/10/30/16e1ab26f431a604?imageView2/0/w/1280/h/960/ignore-error/1)]

  • 标记位既能够设定Activity的启动模式,如同上面介绍的,在动态指定启动模式,比方 FLAG_ACTIVITY_NEW_TASKFLAG_ACTIVITY_SINGLE_TOP 等。它还能够影响 Activity 的运行状态 ,比方 FLAG_ACTIVITY_CLEAN_TOPFLAG_ACTIVITY_EXCLUDE_FROM_RECENTS 等。

  • 以下介绍几个基本的标记位,切勿死记,理解几个就可以,须要时再查官方文档。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-O8LztKsC-1638250133985)(https://user-gold-cdn.xitu.io/2019/10/30/16e1ab26f64ed138?imageView2/0/w/1280/h/960/ignore-error/1)]

  • FLAG_ACTIVITY_NEW_TASK
  1. 作用是为 Activity 指定 “SingleTask” 启动模式。跟在 AndroidMainfest.xml 指定效果同样
  • FLAG_ACTIVITY_SINGLE_TOP
  1. 作用是为 Activity 指定 “SingleTop” 启动模式,跟在 AndroidMainfest.xml 指定效果同样。
  • FLAG_ACTIVITY_CLEAN_TOP
  1. 具有此标记位的 Activity ,启动时会将与该 Activity 在同一任务栈的其他 Activity 出栈。
  2. 一般与 SingleTask 启动模式一起出现。
  3. 它会完毕 SingleTask 的作用。
  4. 但事实上 SingleTask 启动模式默认具有此标记位的作用
  • FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS
  1. 具有此标记位的 Activity 不会出如今历史 Activity 的列表中
  2. 使用场景:当某些情况下我们不希望用户通过历史列表回到 Activity 时,此标记位便体现了它的效果。
  3. 它等同于在 xml 中指定 Activity 的属性.

2.7 onNewInstent()方法什么时候执行

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JVRgoRCd-1638250133985)(https://user-gold-cdn.xitu.io/2019/10/30/16e1ab2713491d3c?imageView2/0/w/1280/h/960/ignore-error/1)]

这个是启动模式中的了,当此 Activity 的实例已经存在,并且此时的启动模式为 SingleTaskSingleInstance ,另外当这个实例位于栈顶且启动模式为 SingleTop 时也会触发 onNewInstent()

三、数据


3.1 Activity 间通过 Intent 传递数据大小限制

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-G8LLlR7m-1638250133986)(https://user-gold-cdn.xitu.io/2019/10/30/16e1ab2718c279eb?imageView2/0/w/1280/h/960/ignore-error/1)]

  • Intent 在传递数据时是有大小限制的,这里官方并未详细说明,不过通过实验的方法可以测出数据应该被限制在 1MB 之内( 1024KB
  • 我们采用传递 Bitmap 的方法,发现当图片大小超过 1024(准确地说是 1020 左右)的时候,程序就会出现闪退、停止运行等异常(不同的手机反应不同)
  • 因此可以判断 Intent 的传输容量在 1MB 之内。

3.2 内存不足时系统会杀掉后台的Activity,若需要进行一些临时状态的保存,在哪个方法进行

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-d5H84RDS-1638250133986)(https://user-gold-cdn.xitu.io/2019/10/30/16e1ab271cea5c35?imageView2/0/w/1280/h/960/ignore-error/1)]

  • ActivityonSaveInstanceState()onRestoreInstanceState() 并不是生命周期方法,它们不同于 onCreate()onPause() 等生命周期方法,它们并不一定会被触发。

  • onSaveInstanceState() 方法,当应用遇到意外情况(如:内存不足、用户直接按 Home 键)由系统销毁一个 ActivityonSaveInstanceState() 会被调用。

  • 但是当用户主动去销毁一个 Activity 时,例如在应用中按返回键,onSaveInstanceState() 就不会被调用。

  • 除非该 activity 不是被用户主动销毁的,通常 onSaveInstanceState() 只适合用于保存一些临时性的状态,而 onPause() 适合用于数据的持久化保存。

3.3 onSaveInstanceState() 被执行的场景

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eAr9i3vE-1638250133986)(https://user-gold-cdn.xitu.io/2019/10/30/16e1ab2734eb5c0d?imageView2/0/w/1280/h/960/ignore-error/1)]

  • 系统不知道你按下 HOME 后要运行多少其他的程序,自然也不知道 activity A 是否会被销毁
  • 因此系统都会调用 onSaveInstanceState() ,让用户有机会保存某些非永久性的数据。以下几种情况的分析都遵循该原则:
  1. 当用户按下 HOME 键时
  2. 长按 HOME 键,选择运行其他的程序时
  3. 锁屏时
  4. activity A 中启动一个新的 activity
  5. 屏幕方向切换时

3.4 两个 Activity 之间跳转时必然会执行的方法

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XsKTMESa-1638250133987)(https://user-gold-cdn.xitu.io/2019/10/30/16e1ab2729e02a24?imageView2/0/w/1280/h/960/ignore-error/1)]

一般情况下比如说有两个 activity , 分别叫 A , B ,当在 A 里面激活 B 组件的时候, A 会调用 onPause() 方法,然后 B 调用 onCreate() , onStart() , onResume()

这个时候 B 覆盖了窗体, A 会调用 onStop() 方法. 如果 B 是个透明的,或者 是对话框的样式, 就不会调用 AonStop() 方法。

3.5 用 Intent 去启动一个Activity 之外的方法

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-a4FLkq9G-1638250133987)(https://user-gold-cdn.xitu.io/2019/10/30/16e1ab2724c3da3d?imageView2/0/w/1280/h/960/ignore-error/1)]

  • 使用 adb shell am 命令
  1. am 启动一个 activity
  2. adb shell am start com.example.fuchenxuan/.MainActivity
  3. am 发送一个广播,使用 action
  4. adb shell am broadcast -a magcomm.action.TOUCH_LETTER

3.6 scheme 跳转协议

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bfa792hh-1638250133988)(https://user-gold-cdn.xitu.io/2019/10/30/16e1ab273d2660f7?imageView2/0/w/1280/h/960/ignore-error/1)]

3.6.1 定义

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VhYoQIdW-1638250133988)(https://user-gold-cdn.xitu.io/2019/10/30/16e1ab273f2b0b6b?imageView2/0/w/1280/h/960/ignore-error/1)]

  • 服务器可以定制化跳转 app 页面

  • app 可以通过 Scheme 跳转到另一个 app 页面

  • 可以通过 h5 页面跳转 app 原生页面

3.6.2 协议格式:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UBbCw3eZ-1638250133988)(https://user-gold-cdn.xitu.io/2019/10/30/16e1ab27484aabff?imageView2/0/w/1280/h/960/ignore-error/1)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KMfQhUPU-1638250133989)(https://user-gold-cdn.xitu.io/2019/10/30/16e1ab275b9808fe?imageView2/0/w/1280/h/960/ignore-error/1)]

  • qh 代表 Scheme 协议名称

  • test 代表 Scheme 作用的地址域

  • 8080 代表改路径的端口号

  • /goods 代表的是指定页面(路径)

  • goodsIdname 代表传递的两个参数

3.6.3 Scheme使用

  • 定义一个 Scheme

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3aP7nZy7-1638250133989)(https://user-gold-cdn.xitu.io/2019/10/30/16e1ab2743ad29d1?imageView2/0/w/1280/h/960/ignore-error/1)]

  • 获取 Scheme 跳转的参数

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AdR3u8ms-1638250133990)(https://user-gold-cdn.xitu.io/2019/10/30/16e1ab2765f5a51a?imageView2/0/w/1280/h/960/ignore-error/1)]

  • 调用方式
  1. 原生调用

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AtGlaJOR-1638250133990)(https://user-gold-cdn.xitu.io/2019/10/30/16e1ab2766001c6d?imageView2/0/w/1280/h/960/ignore-error/1)]

  1. html调用

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2nEL2NOE-1638250133991)(https://user-gold-cdn.xitu.io/2019/10/30/16e1ab276d16ed37?imageView2/0/w/1280/h/960/ignore-error/1)]

  1. 判断某个Scheme是否有效

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vtQuRqGk-1638250133991)(https://user-gold-cdn.xitu.io/2019/10/30/16e1ab278265ad01?imageView2/0/w/1280/h/960/ignore-error/1)]

  • 关于scheme跳转协议,可以查看下面的博客,站在巨人的肩膀上,才能看得更远 Android产品研发(十一)–>应用内跳转Scheme协议

四、Context


4.1 Context , Activity , Appliction 的区别

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HoDi02hf-1638250133992)(https://user-gold-cdn.xitu.io/2019/10/30/16e1ab2780c638c9?imageView2/0/w/1280/h/960/ignore-error/1)]

  • 相同:ActivityApplication 都是 Context 的子类。
  • Context 从字面上理解就是上下文的意思, 在实际应用中它也确实是起到了管理 上下文环境中各个参数和变量的总用, 方便我们可以简单的访问到各种资源。
  • 不同:维护的生命周期不同。Context 维护的是当前的 Activity 的生命周期, Application 维护的是整个项目的生命周期。
  • 使用 context 的时候, 小心内存泄露, 防止内存泄露

4.2 Context 是什么

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IzAxA8s6-1638250133992)(https://user-gold-cdn.xitu.io/2019/10/30/16e1ab278295b2b0?imageView2/0/w/1280/h/960/ignore-error/1)]

  • 它描述的是一个应用程序环境的信息,即上下文。

  • 该类是一个抽象( abstract class )类, Android 提供了该抽象类的具体实 现类( ContextIml )。

  • 通过它我们可以获取应用程序的资源和类, 也包括一些应用级别操作, 例如:启动一个 Activity ,发送广播,接受 Intent ,信息,等。

4.2.1 附加一张 Context 继承关系图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CZ82RJ87-1638250133993)(https://user-gold-cdn.xitu.io/2019/10/30/16e1ab2782c145c5?imageView2/0/w/1280/h/960/format/png/ignore-error/1)]

4.3 获取当前屏幕 Activity 的对象

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hiD4vNMd-1638250133993)(https://user-gold-cdn.xitu.io/2019/10/30/16e1ab278bb02fa6?imageView2/0/w/1280/h/960/ignore-error/1)]

  • 使用 ActivityLifecycleCallbacks

  • Android 如何获取当前Activity实例对象?

[外链图片转存中…(img-IzAxA8s6-1638250133992)]

  • 它描述的是一个应用程序环境的信息,即上下文。

  • 该类是一个抽象( abstract class )类, Android 提供了该抽象类的具体实 现类( ContextIml )。

  • 通过它我们可以获取应用程序的资源和类, 也包括一些应用级别操作, 例如:启动一个 Activity ,发送广播,接受 Intent ,信息,等。

4.2.1 附加一张 Context 继承关系图

[外链图片转存中…(img-CZ82RJ87-1638250133993)]

4.3 获取当前屏幕 Activity 的对象

[外链图片转存中…(img-hiD4vNMd-1638250133993)]

  • 使用 ActivityLifecycleCallbacks

  • Android 如何获取当前Activity实例对象?

Activity 的 36 大难点,你会几个?,Android性能优化之APK优化相关推荐

  1. Activity 的 36 大难点,你会几个?,安卓面试2020

    前言 学 Android 有一段时间了,一直都只顾着学新的东西,最近发现很多平常用的少的东西竟让都忘了,趁着这两天,打算把有关 Activity 的内容以问题的形式梳理出来,也供大家查缺补漏. 本文中 ...

  2. 阿里P8亲自教你!Activity的6大难点,你会几个?年薪50W

    前言 网上有很多对程序员简历的一些指导,这里就不重述,大家可以搜下网上其他大神的总结,结合自身情况修改下.我有几点建议: 1.尽量不要花哨,程序员和设计师或者产品运营还不一样,我们的简历成功与否决定权 ...

  3. android短信!Activity的6大难点,你会几个?深度好文

    前言 从18年毕业至今,就职过两家公司,大大小小项目做了几个,非常感谢我的两位老大,在我的android成长路上给予我很多指导,亦师亦友的关系. 从年前至今参加面试了很多公司,也收到了几家巨头的off ...

  4. python整数预测_时间序列预测全攻略(附带Python代码) | 36大数据

    介绍 时间序列(简称TS)被认为是分析领域比较少人知道的技能.(我也是几天前才知道它).但是你一定知道最近的小型编程马拉松就是基于时间序列发展起来的,我参加了这项活动去学习了解决时间序列问题的基本步骤 ...

  5. 二维码解码程序的两大难点问题

    二维码解码程序的两大难点问题 第一是如何对摄像头捕捉的PNG格式的图像数据进行解析,以及识别黑白模块的问题 第二是RS编码的纠错算法过程. 对PNG格式的解析,需要参考PNG格式的规范.识别黑白块要参 ...

  6. 计算机考研数学基础知识点,2019计算机考研数学7大难点梳理

    2019考研已经进入到冲刺阶段,大家复习得怎么样了?为了帮助大家更好的复习,中公考研小编为大家分享"2019计算机考研数学7大难点梳理",希望对大家有帮助. 1.函数.极限与连续. ...

  7. 36大数据——《数据可视化的魅力》

    数据可视化的魅力 | 36大数据 http://www.36dsj.com/archives/70060 数据可视化的魅力 雪姬 2016-11-29 10:55:40 数据可视化 评论(0) 文 | ...

  8. 航空专家:中国北斗系统与美国GPS相比存3大难点

    航空专家:中国北斗系统与美国GPS相比存3大难点 收藏 核心提示:北斗卫星导航系统工程副总设计师谭述森研究员告诉记者,北斗系统与GPS相比存3大难点:第一是原子钟上存在差距:第二是美国可以在全球范围内 ...

  9. 36大数据专访极光大数据 用数据改变世界

     36大数据专访极光大数据 用数据改变世界 36大数据 2017-03-17 4:08:46 人物观点 评论(0) 从互联网诞生的第一天起,数据就如约而行.而随着互联网应用的日益深化,2016年全 ...

最新文章

  1. 绘制clothoid曲线
  2. 雷林鹏分享:PHP 魔术常量
  3. 漫谈IDS的虚拟化发展
  4. 玩转Mixly – 9、Arduino AVR编程 之 函数
  5. 《Programming WPF》翻译 第8章 6.我们进行到哪里了?
  6. feign返回null_109、Feign的服务降级和Turbine
  7. 世纪佳缘,玫瑰和面包开始PK
  8. Android基础字符串String.md
  9. matlab线性拉伸函数,采用线性变换对图像的每一个像素灰度作线性拉伸-Read.PPT
  10. ReactNative组件导出
  11. 仿真技术为“工业 4.0”插上想象的翅膀
  12. Security+ 学习笔记12 安全编码实践
  13. BIM族库下载——Revit栏杆族库
  14. 木马病毒的传播方式这么多,在你的日常冲浪中,木马病毒就进行了传播!
  15. android usb采集卡,手机USB视频采集卡, 支持IOS、安卓系统
  16. 关于pycharm出现unindent does not match any outer indentation level错误的解决
  17. 正则表达式之邮箱地址格式+非法字符+后缀长度的验证
  18. 计算机音乐音序是什么意思,什么叫音序?什么叫音节?
  19. 程序员是如何买房的?
  20. ACL2021_Enhancing Entity Boundary Detection for Better Chinese Named Entity Recognition

热门文章

  1. pymunk中怎么设置实体的线速度阻力系数和角速度阻力系数
  2. 战略规划+数字化转型实战案例——定制家居企业的制胜之道
  3. Ubunto系统安装BOA嵌入式web服务器
  4. 输出1-30之间奇数的个数及所有奇数的和
  5. C++实践小经验——#include 何时放在头文件里,何时放在cpp文件里?
  6. python利用proxybroker构建爬虫免费IP代理池!不用担心被封了!
  7. 少儿编程要先学会电脑和英语
  8. 请给我一篇 Go 工程实践干货 @ Go中国
  9. 云服务器Linux(Centos7)安装 vsftpd 教程(图文详解)
  10. 重庆体制内计算机老师,重庆教师资格证网(算不算体制内的)