美文网首页
Android 四大组件--Activity

Android 四大组件--Activity

作者: zerohdq | 来源:发表于2019-04-08 16:06 被阅读0次

    Activity的生命周期

    生命周期:onCreate() -> onStart() - > onResume() -> onPause() -> onStop() -> onDestroy()

    生命周期图

    onCreate():Activity正在被创建,做一些初始化工作,加载布局,初始化数据;

    onRestart():Activity正在重新启动。从不可见重新变成可见,调用此方法;

    onStart():Activity正在被启动,已经可见但无法与用户交互;

    onResume():Activity在返回栈顶端,获得焦点,可以和用户进行交互;

    onPause():Activity正在停止,不能做太耗时的工作,onPause必须执行,新的Activity的                                  onResume才会执行;

    onStop():Activity即将停止,可以做一些轻量的回收工作,不能太耗时;

    onDestroy():Activity即将被销毁,做回收工作和资源的释放。


    Activity启动

    A启动

    onCreate->onStart->onResume

    打开新的Activity或者切换到桌面时(新的activity是透明主题,当前activity不会调用onStop)

    onPause->onStop

    再次回到原Activity时

    onRestart->onStart->onResume

    用户按back键回退

    onPause->onStop->onDestroy

    A启动B

    04-08 10:40:28.124 32671-32671/com.hdq.study.studydemo E/MAIN: MainActivity onPause

    04-08 10:40:28.168 32671-32671/com.hdq.study.studydemo E/MAIN: SecondActivity onCreate

    04-08 10:40:28.170 32671-32671/com.hdq.study.studydemo E/MAIN: SecondActivity onStart

    04-08 10:40:28.174 32671-32671/com.hdq.study.studydemo E/MAIN: SecondActivity onResume

    04-08 10:40:28.576 32671-32671/com.hdq.study.studydemo E/MAIN: MainActivity onStop

    从B返回A

    04-08 10:41:36.605 32671-32671/com.hdq.study.studydemo E/MAIN: SecondActivity onPause

    04-08 10:41:36.611 32671-32671/com.hdq.study.studydemo E/MAIN: MainActivity onRestart

    04-08 10:41:36.612 32671-32671/com.hdq.study.studydemo E/MAIN: MainActivity onStart

    04-08 10:41:36.613 32671-32671/com.hdq.study.studydemo E/MAIN: MainActivity onResume

    04-08 10:41:37.010 32671-32671/com.hdq.study.studydemo E/MAIN: MainActivity onStop

    04-08 10:41:37.011 32671-32671/com.hdq.study.studydemo E/MAIN: SecondActivity onDestroy

    A启动透明的B

    04-08 10:40:28.124 32671-32671/com.hdq.study.studydemo E/MAIN: MainActivity onPause

    04-08 10:40:28.168 32671-32671/com.hdq.study.studydemo E/MAIN: SecondActivity onCreate

    04-08 10:40:28.170 32671-32671/com.hdq.study.studydemo E/MAIN: SecondActivity onStart

    04-08 10:40:28.174 32671-32671/com.hdq.study.studydemo E/MAIN: SecondActivity onResume

    异常情况下的生命周期

    比如系统配置资源发生改变以及内存不足,activity都会被杀死。

    情况一

    资源相关的系统配置发生改变导致activity被杀死并重新创建 比如说当前activity处于竖屏状态,如果突然旋转屏幕,由于系统配置发生了改变,在默认情况下,activity就会被销毁并且重新创建,当然我们也可以组织系统重新创建我们的activity。

    系统配置发生改变以后,activity会销毁,其onPause,onStop,onDestory均会被调用,由于activity是在异常情况下终止的,系统会调用onSaveInstance来保存当前activity状态,这个方法的调用时机是在onStop之前。与onPause没有既定的时序关系,当activity重新创建后,系统会调用onRestoreInstanceState,并且把activity销毁时onSaveInstanceState方法保存的Bundle对象作为参数同时传递给onRestoreInstanceState和onCreate方法。onRestoreInstanceState()onStart()方法后回调。

    同时,在onSaveInstanceState和onRestoreInstanceState方法中,系统自动为我们做了一些恢复工作,如:文本框(EditeText)中用户输入的数据,ListView滚动的位置等,这些view相关的状态系统都能够默认为我们恢复。可以查看view源码,和activity一样,每个view都有onSaveInstanceState方法和onRestoreInstanceState方法。

    04-09 08:59:11.556 385-385/? E/MAIN: MainActivity onCreate

    04-09 08:59:11.558 385-385/? E/MAIN: MainActivity onStart

    04-09 08:59:11.561 385-385/? E/MAIN: MainActivity onResume

    04-09 09:00:44.033 385-385/com.hdq.study.studydemo E/MAIN: MainActivity onPause

    04-09 09:00:44.036 385-385/com.hdq.study.studydemo E/MAIN: MainActivity onSaveInstanceState

    04-09 09:00:44.041 385-385/com.hdq.study.studydemo E/MAIN: MainActivity onStop

        MainActivity onDestroy

    04-09 09:00:44.077 385-385/com.hdq.study.studydemo E/MAIN: MainActivity onCreate

    04-09 09:00:44.078 385-385/com.hdq.study.studydemo E/MAIN: MainActivity onStart

    04-09 09:00:44.079 385-385/com.hdq.study.studydemo E/MAIN: MainActivity onRestoreInstanceState

    04-09 09:00:44.082 385-385/com.hdq.study.studydemo E/MAIN: MainActivity onResume

    情况2

    资源内存不足导致低优先级的activity被杀死 这里的情况和前面的情况1数据存储和恢复是完全一致的,activity按照优先级从高到低可以分为如下三种:

    (1)前台activity---正在和用户交互的activity,优先级最高

    (2)可见但非前台activity---比如activity中弹出了一个对话框,导致activity可见但是位于后台无法和用户直接交互。

    (3)后台activity---已经被暂停的activity,比如执行了onStop,优先级最低。

    防止重新创建activity:

    activity指定configChange属性来不让系统重新创建activity。 android : configChanges = "orientation|screenSize"

    Activity启动模式  

    当我们启动多个Activity时,系统会创建多个实例并把它们一一放进任务栈,任务栈是一种“后进先出”的栈结构。TaskAffinity,任务相关性,可以在清单文件设置Activity所需要的任务栈,默认情况下,所有Activity所需的任务栈的名字为应用的包名。

    standard:标准模式

    系统的默认模式,每次启动一个Activity都会重新创建一个新的实例。不管这个实例存不存在,这种模式下,谁启动了该模式的 Activity,该 Activity 就属于启动它的 Activity 的任务栈中。

    singleTop:栈顶复用模式

    如果新Activity已经位于任务栈的栈顶,那么此Activity不会被重新创建,同时它的onNewIntent方法会被回调,通过此方法的参数我们可以取出当前请求的信息。新Activity的onCreate,onStart不会被系统调用。如果新Activity的实例已经存在但不是在栈顶的话,那么新Activity还是会被重新创建。

    singleTask:栈内复用模式

    只有Activity在一个栈中存在,那么多次启动此Activity不会重新创建实例,复用时,会将它上面的 Activity 全部出栈,会回调它的OnNewIntent。当一个具有singleTask的Activity--A请求启动的时候,系统首先去寻找是否存在A想要的任务栈,如果不存在,就会重新创建一个任务栈,在创建A的实例并放入任务栈中。如果存在这个任务栈,A存在的话,系统会把A调到栈顶并调用它的OnNewIntent方法,A不存在的话,创建A的实例并压入栈中。

    singleInstance:单实例模式

    该模式具备 singleTask 模式的所有特性外,与它的区别就是,这种模式下的 Activity 会单独占用一个Task栈,具有全局唯一性,即整个系统中就这么一个实例,由于栈内复用的特性,后续的请求均不会创建新的 Activity 实例,除非这个特殊的任务栈被销毁了。以 singleInstance 模式启动的 Activity 在整个系统中是单例的,如果在启动这样的 Activiyt 时,已经存在了一个实例,那么会把它所在的任务调度到前台,重用这个实例。

    显示调用

    需要明确的指定被启动对象的组件信息,包括报名和类名。

    隐式调用

    需要Intent能够匹配目标组件的IntentFilter中所设置的过滤信息,如果不匹配将无法启动目标Activity。需要用 PackageManager 的 resolveActivity 方法或者 Intent 的 resolveActivity 方法判断是否有 Activity 匹配该隐式 Intent。

    IntentFilter的匹配规则

    1.一个intent需要同时匹配过滤列表中的action、category、data信息。

    2.一个Activity中可以有多个intent-filter,一个intent只要匹配任何一组intent-filter即可成功启动对应的Activity。

    action的匹配规则

    要求 intent 中的 action 存在且必须和 intent-filter 中的其中一个 action 相同。区分大小写。

    category的匹配规则

    intent 中的 category 可以不存在,这是因为此时系统给该 Activity 默认加上了“android.intent.category.DEFAULT"属性值。除上述情况外,有其他 category,则要求 intent 中的 category 和 intent-filter 中的所有 category 相同。

    data的匹配规则

    如果过滤规则中定义了data,那么intent中必须也要定义可匹配的data。

    data由两个部分组成,mimeType和URL。mineType指媒体类型,没有指定URL,intent的URL部分的schema必须为content或者file。

    intent指定完整的data,必须要调用setDataAndType方法。


    相关文章

      网友评论

          本文标题:Android 四大组件--Activity

          本文链接:https://www.haomeiwen.com/subject/jmasiqtx.html