- 学 Android 有一段时间了,一直都只顾着学新的东西,最近发现很多平常用的少的东西竟让都忘了,趁着这两天,打算把有关 Activity 的内容以问题的形式梳理出来,也供大家查缺补漏。
文章目录本文中,我将一改往日写博客的习惯,全文用 XMind 将所有知识点以思维导图的形式呈现,欢迎大家食用~~
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QHgA2dEJ-1637978600673)(https://user-gold-cdn.xitu.io/2019/10/30/16e1ab263bcee1cb?imageView2/0/w/1280/h/960/ignore-error/1)]
方便大家学习,我在 GitHub 上建立个 仓库-
仓库内容与博客同步更新。由于我在 稀土掘金 简书 CSDN 博客园 等站点,都有新内容发布。所以大家可以直接关注该仓库,以免错过精彩内容!
-
仓库地址: 超级干货!精心归纳 Android 、JVM 、算法等,各位帅气的老铁支持一下!给个 Star !
- 在开始之前,先让我们看看 Android 的 activity 到底都有哪些东西?
- 借一张网上很火的图带你了解 Activity
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JiZh91hf-1637978600718)(https://user-gold-cdn.xitu.io/2019/10/30/16e1ab263d2eccd9?imageView2/0/w/1280/h/960/ignore-error/1)]
一、生命周期- 先贴一张闻名遐迩的图
- 我们生命周期先看看具体有哪些方法回调,在逐一攻破:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cD9Ev7RH-1637978600719)(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-17SS6rVL-1637978600720)(https://user-gold-cdn.xitu.io/2019/10/30/16e1ab2640bfa92b?imageView2/0/w/1280/h/960/ignore-error/1)]
- 如果是单纯是创建的 dialog ,Activity 并不会执行生命周期的方法
- 但是如果是跳转到一个不是全屏的 Activity 的话, 当然就是按照正常的生命周期来执行了
- 即 onPasue() -> onPause() ( 不会执行原 Activity 的 onStop() , 否则上个页面就不显示了 )
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dmKaWmyK-1637978600721)(https://user-gold-cdn.xitu.io/2019/10/30/16e1ab2640d09989?imageView2/0/w/1280/h/960/ignore-error/1)]
-
不设置 Activity 的 android:configChanges 时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次
-
设置 Activity 的 android:configChanges="orientation" 时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次
-
设置 Activity 的 android:configChanges="orientation|keyboardHidden" 时,切屏不会重新调用各个生命周期,只会执行 onConfigurationChanged 方法
-
注意:还有一点,非常重要,一个 Android 的变更细节!当 API >12 时,需要加入 screenSize 属性,否则屏幕切换时即使你设置了 orientation 系统也会重建 Activity !
-
横竖屏切换生命周期的执行
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jEGNXCqT-1637978600722)(https://user-gold-cdn.xitu.io/2019/10/30/16e1ab2662135b32?imageView2/0/w/1280/h/960/ignore-error/1)]
- 启动 Activity : onCreate() —> onStart() —> onResume() ,Activity 进入运行状态。
- 锁屏时会执行 onPause() 和 onStop() , 而开屏时则应该执行 onStart() onResume()
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wxXTpsJv-1637978600723)(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()
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UmROzvvo-1637978600723)(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-mRyAqNdm-1637978600724)(https://user-gold-cdn.xitu.io/2019/10/30/16e1ab2668399456?imageView2/0/w/1280/h/960/ignore-error/1)]
- 发送特定广播:
- 在需要结束应用时, 发送一个特定的广播,每个 Activity 收到广播后,关闭 即可。
- 给某个 activity 注册接受接受广播的意图 registerReceiver(receiver, filter)
- 如果过接受到的是 关闭 activity 的广播 activity finish() 掉
- 递归退出
- 就调用 finish() 方法 把当前的 Activity 退出
- 在打开新的 Activity 时使用 startActivityForResult , 然后自己加标志, 在 onActivityResult 中处理, 递归关闭。
- 其实
- 也可以通过 intent 的 flag 来实现 intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP) 激活一个新的 activity。
- 此时如果该任务栈中已经有该 Activity , 那么系统会把这个 Activity 上面的所有 Activity 干掉。
- 其实相当于给 Activity 配置的启动模式为 singleTask 。
- 记录打开的 Activity
- 每打开一个 Activity , 就记录下来。
- 在需要退出时 , 关闭每一个 Activity
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aMOQpERw-1637978600724)(https://user-gold-cdn.xitu.io/2019/10/30/16e1b5f0ff6a9d15?imageView2/0/w/1280/h/960/ignore-error/1)]
- 锁屏时会执行 onPause() 和 onStop() , 而开屏时则应该执行 onStart() onResume()
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sE06Pvt6-1637978600725)(https://user-gold-cdn.xitu.io/2019/10/30/16e1ab2666eae897?imageView2/0/w/1280/h/960/ignore-error/1)]
- 可以通过两种方式 , 一是通过定义 Activity 的主题 ,二是通过覆写 Activity 的 overridePendingTransition 方法。
- 通过设置主题样式在 styles.xml 中编辑代码 , 添加 themes.xml 文件:在 AndroidManifest.xml 中给指定的 Activity 指定 theme。
- 覆写 overridePendingTransition 方法:overridePendingTransition(R.anim.fade, R.anim.hold);
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-q3bp1il7-1637978600725)(https://user-gold-cdn.xitu.io/2019/10/30/16e1ab26844b8ee7?imageView2/0/w/1280/h/960/ignore-error/1)]
- runnig :用户可以点击,activity 处于栈顶状态。
- paused :activity 失去焦点的时候,被一个非全屏的 activity 占据或者被一个透明的 activity 覆盖,这个状态的 activity 并没有销毁,它所有的状态信息和成员变量仍然存在,只是不能够被点击。(内存紧张的情况,这个 activity 有可能被回收)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-59AoZD9z-1637978600726)(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 已经被销毁,其所有的状态信息和成员变量已经不存在了。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AUgNWLqU-1637978600726)(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-EibX9emP-1637978600727)(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 的操作,这样会减少之前崩溃所造成的后遗症!
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-62q7F7Ii-1637978600727)(https://user-gold-cdn.xitu.io/2019/10/30/16e1ab26900d9292?imageView2/0/w/1280/h/960/ignore-error/1)]
-
如果 IntentActivity 处于任务栈的顶端,也就是说之前打开过的 Activity ,现在处于 onPause 、 onStop 状态的话,其他应用再发送 Intent 的话
-
执行顺序为:onNewIntent,onRestart,onStart,onResume。
2.1 启动模式
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DhpcFeNY-1637978600728)(https://user-gold-cdn.xitu.io/2019/10/30/16e1ab2695ac3863?imageView2/0/w/1280/h/960/ignore-error/1)]
- Activity 一共有四种 launchMode :standard 、singleTop 、singleTask 、singleInstance 。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oec1MGe6-1637978600728)(https://user-gold-cdn.xitu.io/2019/10/30/16e1ab26af18ff50?imageView2/0/w/1280/h/960/ignore-error/1)]
- Standard 模式(默认模式)
-
说明: 每次启动一个 Activity 都会又一次创建一个新的实例入栈,无论这个实例是否存在。
-
生命周期:每次被创建的实例 Activity 的生命周期符合典型情况,它的 onCreate 、onStart 、onResume 都会被调用。
-
举例:此时 Activity 栈中以此有 A 、B 、C 三个 Activity ,此时C处于栈顶,启动模式为 Standard 模式。若在 C Activity 中加入点击事件,须要跳转到还有一个同类型的 C Activity 。结果是还有一个 C Activity 进入栈中,成为栈顶。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aflIXLrW-1637978600729)(https://user-gold-cdn.xitu.io/2019/10/30/16e1ab26af2f73ef?imageView2/0/w/1280/h/960/ignore-error/1)]
- SingleTop 模式(栈顶复用模式)
-
说明:分两种处理情况:须要创建的 Activity 已经处于栈顶时,此时会直接复用栈顶的 Activity 。不会再创建新的 Activity ;若须要创建的 Activity 不处于栈顶,此时会又一次创建一个新的 Activity 入栈,同 Standard 模式一样。
-
生命周期:若情况一中栈顶的 Activity 被直接复用时,它的 onCreate 、onStart 不会被系统调用,由于它并没有发生改变。可是一个新的方法 onNewIntent 会被回调( Activity 被正常创建时不会回调此方法)。
-
举例:此时 Activity 栈中以此有 A 、B 、C 三个 Activity ,此时 C 处于栈顶,启动模式为 SingleTop 模式。情况一:在 C Activity 中加入点击事件,须要跳转到还有一个同类型的 C Activity 。结果是直接复用栈顶的 C Activity。情况二:在 C Activity 中加入点击事件,须要跳转到还有一个 A Activity。结果是创建一个新的 Activity 入栈。成为栈顶。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VPhueTLm-1637978600729)(https://user-gold-cdn.xitu.io/2019/10/30/16e1ab26b234a4cb?imageView2/0/w/1280/h/960/ignore-error/1)]
- SingleTask 模式(栈内复用模式)
-
说明:若须要创建的 Activity 已经处于栈中时,此时不会创建新的 Activity ,而是将存在栈中的 Activity 上面的其他 Activity 所有销毁,使它成为栈顶。
-
如果是在别的应用程序中启动它,则会新建一个 task ,并在该task中启动这个 Activity ,singleTask 允许别的 Activity 与其在一个 task 中共存,也就是说,如果我在这个 singleTask 的实例中再打开新的 Activity ,这个新的 Activity 还是会在 singleTask 的实例的 task 中。
-
生命周期:同 SingleTop 模式中的情况一同样。仅仅会又一次回调 Activity 中的 onNewIntent 方法
-
举例:此时 Activity 栈中以此有 A 、B 、C 三个 Activity 。此时 C 处于栈顶,启动模式为 SingleTask 模式。情况一:在 C Activity 中加入点击事件,须要跳转到还有一个同类型的 C Activity 。结果是直接用栈顶的 C Activity 。情况二:在 C Activity 中加入点击事件,须要跳转到还有一个 A Activity 。结果是将 A Activity 上面的 B 、C 所有销毁,使 A Activity 成为栈顶。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ra1krKIV-1637978600729)(https://user-gold-cdn.xitu.io/2019/10/30/16e1ab26b197fba4?imageView2/0/w/1280/h/960/ignore-error/1)]
- SingleInstance 模式(单实例模式)
-
说明: SingleInstance 比较特殊,是全局单例模式,是一种加强的 SingleTask 模式。它除了具有它所有特性外,还加强了一点:只有一个实例,并且这个实例独立运行在一个 task 中,这个 task 只有这个实例,不允许有别的 Activity 存在。
-
这个经常使用于系统中的应用,比如 Launch 、锁屏键的应用等等,整个系统中仅仅有一个!所以在我们的应用中一般不会用到。了解就可以。
-
举例:比方 A Activity 是该模式,启动 A 后。系统会为它创建一个单独的任务栈,由于栈内复用的特性。兴许的请求均不会创建新的 Activity ,除非这个独特的任务栈被系统销毁。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LGm9ep9A-1637978600730)(https://user-gold-cdn.xitu.io/2019/10/30/16e1ab26b281455b?imageView2/0/w/1280/h/960/ignore-error/1)]
- 在 Manifest.xml 中指定 Activity 启动模式
- 一种静态的指定方法
- 在 Manifest.xml 文件里声明 Activity 的同一时候指定它的启动模式
- 这样在代码中跳转时会依照指定的模式来创建 Activity 。
- 启动 Activity 时。在 Intent 中指定启动模式去创建 Activity
- 一种动态的启动模式
- 在 new 一个 Intent 后
- 通过 Intent 的 addFlags 方法去动态指定一个启动模式。
- 注意:以上两种方式都能够为 Activity 指定启动模式,可是二者还是有差别的。
-
优先级:动态指定方式即另外一种比第一种优先级要高,若两者同一时候存在,以另外一种方式为准。
-
限定范围:第一种方式无法为 Activity 直接指定 FLAG_ACTIVITY_CLEAR_TOP 标识,另外一种方式无法为 Activity 指定 singleInstance 模式。
这四种模式中的 Standard 模式是最普通的一种,没有什么特别注意。而 SingleInstance 模式是整个系统的单例模式,在我们的应用中一般不会应用到。所以,这里就具体解说 SingleTop 和 SingleTask 模式的运用场景:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rpWNWrIi-1637978600730)(https://user-gold-cdn.xitu.io/2019/10/30/16e1ab26b65bb92a?imageView2/0/w/1280/h/960/ignore-error/1)]
- SingleTask 模式的运用场景
- 最常见的应用场景就是保持我们应用开启后仅仅有一个 Activity 的实例。
- 最典型的样例就是应用中展示的主页( Home 页)。
- 假设用户在主页跳转到其他页面,运行多次操作后想返回到主页,假设不使用 SingleTask 模式,在点击返回的过程中会多次看到主页,这明显就是设计不合理了。
- SingleTop 模式的运用场景
- 假设你在当前的 Activity 中又要启动同类型的 Activity
- 此时建议将此类型 Activity 的启动模式指定为 SingleTop ,能够降低Activity的创建,节省内存!
- 注意:复用 Activity 时的生命周期回调
- 这里还须要考虑一个 Activity 跳转时携带页面參数的问题。
- 由于当一个 Activity 设置了 SingleTop 或者 SingleTask 模式后,跳转此 Activity 出现复用原有 Activity 的情况时,此 Activity 的 onCreate 方法将不会再次运行。onCreate 方法仅仅会在第一次创建 Activity 时被运行。
- 而一般 onCreate 方法中会进行该页面的数据初始化、UI 初始化,假设页面的展示数据无关页面跳转传递的參数,则不必操心此问题
- 若页面展示的数据就是通过 getInten() 方法来获取,那么问题就会出现:getInten() 获取的一直都是老数据,根本无法接收跳转时传送的新数据!
- 以下,通过一个样例来具体解释:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mloWwTV9-1637978600731)(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-vUjgTBf2-1637978600731)(https://user-gold-cdn.xitu.io/2019/10/30/16e1ab26f4794839?imageView2/0/w/1280/h/960/ignore-error/1)]
- 这样,在一个页面中能够反复跳转并显示不同的内容。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YRasJQIq-1637978600732)(https://user-gold-cdn.xitu.io/2019/10/30/16e1ab26f46155c8?imageView2/0/w/1280/h/960/ignore-error/1)]
- 这个问题其实也是比较简单的,就是不要在 Activity 的 onCreate 方法中执行过多繁重的操作,并且在 onPasue 方法中同样不能做过多的耗时操作。
-
注意!这里并不是要回答 Activity 的生命周期!
-
3 分钟看懂 Activity 启动流程
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WODqL5Bk-1637978600732)(https://user-gold-cdn.xitu.io/2019/10/30/16e1ab26f431a604?imageView2/0/w/1280/h/960/ignore-error/1)]
-
标记位既能够设定Activity的启动模式,如同上面介绍的,在动态指定启动模式,比方 FLAG_ACTIVITY_NEW_TASK 和 FLAG_ACTIVITY_SINGLE_TOP 等。它还能够影响 Activity 的运行状态 ,比方 FLAG_ACTIVITY_CLEAN_TOP 和 FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS 等。
-
以下介绍几个基本的标记位,切勿死记,理解几个就可以,须要时再查官方文档。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zTLqJ8V1-1637978600732)(https://user-gold-cdn.xitu.io/2019/10/30/16e1ab26f64ed138?imageView2/0/w/1280/h/960/ignore-error/1)]
- FLAG_ACTIVITY_NEW_TASK
- 作用是为 Activity 指定 “SingleTask” 启动模式。跟在 AndroidMainfest.xml 指定效果同样
- FLAG_ACTIVITY_SINGLE_TOP
- 作用是为 Activity 指定 “SingleTop” 启动模式,跟在 AndroidMainfest.xml 指定效果同样。
- FLAG_ACTIVITY_CLEAN_TOP
- 具有此标记位的 Activity ,启动时会将与该 Activity 在同一任务栈的其他 Activity 出栈。
- 一般与 SingleTask 启动模式一起出现。
- 它会完毕 SingleTask 的作用。
- 但事实上 SingleTask 启动模式默认具有此标记位的作用
- FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS
- 具有此标记位的 Activity 不会出如今历史 Activity 的列表中
- 使用场景:当某些情况下我们不希望用户通过历史列表回到 Activity 时,此标记位便体现了它的效果。
- 它等同于在 xml 中指定 Activity 的属性.
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-o3JoQc5u-1637978600733)(https://user-gold-cdn.xitu.io/2019/10/30/16e1ab2713491d3c?imageView2/0/w/1280/h/960/ignore-error/1)]
这个是启动模式中的了,当此 Activity 的实例已经存在,并且此时的启动模式为 SingleTask 和 SingleInstance ,另外当这个实例位于栈顶且启动模式为 SingleTop 时也会触发 onNewInstent() 。
三、数据3.1 Activity 间通过 Intent 传递数据大小限制
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1KYhCEzK-1637978600733)(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 之内。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-krAg2jOQ-1637978600734)(https://user-gold-cdn.xitu.io/2019/10/30/16e1ab271cea5c35?imageView2/0/w/1280/h/960/ignore-error/1)]
-
Activity 的 onSaveInstanceState() 和 onRestoreInstanceState() 并不是生命周期方法,它们不同于 onCreate() 、onPause() 等生命周期方法,它们并不一定会被触发。
-
onSaveInstanceState() 方法,当应用遇到意外情况(如:内存不足、用户直接按 Home 键)由系统销毁一个 Activity ,onSaveInstanceState() 会被调用。
-
但是当用户主动去销毁一个 Activity 时,例如在应用中按返回键,onSaveInstanceState() 就不会被调用。
-
除非该 activity 不是被用户主动销毁的,通常 onSaveInstanceState() 只适合用于保存一些临时性的状态,而 onPause() 适合用于数据的持久化保存。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JtOVIZRs-1637978600734)(https://user-gold-cdn.xitu.io/2019/10/30/16e1ab2734eb5c0d?imageView2/0/w/1280/h/960/ignore-error/1)]
- 系统不知道你按下 HOME 后要运行多少其他的程序,自然也不知道 activity A 是否会被销毁
- 因此系统都会调用 onSaveInstanceState() ,让用户有机会保存某些非永久性的数据。以下几种情况的分析都遵循该原则:
- 当用户按下 HOME 键时
- 长按 HOME 键,选择运行其他的程序时
- 锁屏时
- 从 activity A 中启动一个新的 activity 时
- 屏幕方向切换时
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ORzBiPHc-1637978600734)(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 是个透明的,或者 是对话框的样式, 就不会调用 A 的 onStop() 方法。
3.5 用 Intent 去启动一个Activity 之外的方法《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》
【docs.qq.com/doc/DSkNLaERkbnFoS0ZF】 完整内容开源分享
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dOh141zb-1637978600735)(https://user-gold-cdn.xitu.io/2019/10/30/16e1ab2724c3da3d?imageView2/0/w/1280/h/960/ignore-error/1)]
- 使用 adb shell am 命令
- am 启动一个 activity
- adb shell am start com.example.fuchenxuan/.MainActivity
- am 发送一个广播,使用 action
- adb shell am broadcast -a magcomm.action.TOUCH_LETTER
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZRriHc1N-1637978600735)(https://user-gold-cdn.xitu.io/2019/10/30/16e1ab273d2660f7?imageView2/0/w/1280/h/960/ignore-error/1)]
3.6.1 定义[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1j53T9WG-1637978600736)(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 原生页面
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-L8tEOveN-1637978600736)(https://user-gold-cdn.xitu.io/2019/10/30/16e1ab27484aabff?imageView2/0/w/1280/h/960/ignore-error/1)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-P4R7eG46-1637978600737)(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 代表的是指定页面(路径)
-
goodsId 和 name 代表传递的两个参数
- 定义一个 Scheme
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vKtLKAwG-1637978600737)(https://user-gold-cdn.xitu.io/2019/10/30/16e1ab2743ad29d1?imageView2/0/w/1280/h/960/ignore-error/1)]
- 获取 Scheme 跳转的参数
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ev3aUWEj-1637978600738)(https://user-gold-cdn.xitu.io/2019/10/30/16e1ab2765f5a51a?imageView2/0/w/1280/h/960/ignore-error/1)]
- 调用方式
- 原生调用
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DEQOQ2dO-1637978600738)(https://user-gold-cdn.xitu.io/2019/10/30/16e1ab2766001c6d?imageView2/0/w/1280/h/960/ignore-error/1)]
- html调用
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tqO8XRI3-1637978600738)(https://user-gold-cdn.xitu.io/2019/10/30/16e1ab276d16ed37?imageView2/0/w/1280/h/960/ignore-error/1)]
- 判断某个Scheme是否有效
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4Qf9Y8Cw-1637978600739)(https://user-gold-cdn.xitu.io/2019/10/30/16e1ab278265ad01?imageView2/0/w/1280/h/960/ignore-error/1)]
- 关于scheme跳转协议,可以查看下面的博客,站在巨人的肩膀上,才能看得更远 Android产品研发(十一)–>应用内跳转Scheme协议
4.1 Context , Activity , Appliction 的区别
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Z9sbiCL8-1637978600739)(https://user-gold-cdn.xitu.io/2019/10/30/16e1ab2780c638c9?imageView2/0/w/1280/h/960/ignore-error/1)]
跳转的参数
[外链图片转存中…(img-ev3aUWEj-1637978600738)]
- 调用方式
- 原生调用
[外链图片转存中…(img-DEQOQ2dO-1637978600738)]
- html调用
[外链图片转存中…(img-tqO8XRI3-1637978600738)]
- 判断某个Scheme是否有效
[外链图片转存中…(img-4Qf9Y8Cw-1637978600739)]
- 关于scheme跳转协议,可以查看下面的博客,站在巨人的肩膀上,才能看得更远 Android产品研发(十一)–>应用内跳转Scheme协议
4.1 Context , Activity , Appliction 的区别
[外链图片转存中…(img-Z9sbiCL8-1637978600739)]



