Activity

作者: small_yg | 来源:发表于2017-09-11 19:21 被阅读0次

    写在前面

    接下来准备开一个系列,系统介绍 Android 知识。本系列意在总结、介绍,并选择性的分析源码。

    生命周期

    Activity 生命周期

    1. Activity 的生命周期是:onCreate() -> onStart() -> onResume() -> onPause() -> onStop() ->       onDestroy()。

    2. 当启动新的 Activity 并且此 Activity 不再可见时,系统会调用 onStop() 。

    3. 当设备转入休眠状态或出现对话框时,并且此 Activity 可见,系统会调用 onPause() 。

    启动模式

    standard

    标准启动模式,也是 activity 的默认启动模式。在这种模式下启动的 activity 可以被多次实例化,即在同一个任务中可以存在多个 activity 的实例,每个实例都会处理一个 Intent 对象。

    singleTop

    如果一个以 singleTop 模式启动的 activity 的实例已经存在于任务栈的栈顶,那么再启动这个Activity 时,不会创建新的实例,而是重用位于栈顶的那个实例,并且会调用该实例的onNewIntent() 方法将 Intent 对象传递到这个实例中。如果以 singleTop 模式启动的 activity 的一个实例已经存在与任务栈中,但是不在栈顶,那么它的行为和 standard 模式相同,也会创建多个实例。

    singleTask

    如果设置了特殊的 taskAffinity 并且启动方式是 singleTask,那么会在新的 task 中启动 activity 否则会在当前的 task 中启动 activity ,如果系统中已经存在这样的一个 activity 则会重用这个实例,并把此 activity 上边的所有 activity 出栈,并且调用他的 onNewIntent() 方法。

    singleInstance

    总是在新的任务中开启,并且这个新的任务中有且只有这一个实例,也就是说被该实例启动的其他 activity 会自动运行于另一个任务中。当再次启动该 activity 的实例时,会重用已存在的任务和实例。并且会调用这个实例的 onNewIntent() 方法,将 Intent 实例传递到该实例中。

    Intent flag

    启动 Activity 时,您可以通过在传递给 startActivity() 的 Intent 中加入相应的标志,修改 Activity 与其任务的默认关联方式。如果同时设置了 Intent flag 和 launch mode,则以 Intent flag 为准。

    保存状态

    android low memory killer 机制

    网上相关 low memory killer 的文章很多,可以看下 low memory killer 机制 。

    状态恢复

    当系统为了恢复内存而销毁某项 Activity 时,Activity 对象也会被销毁,因此系统在继续 Activity 时根本无法让其状态保持完好,而是必须在用户返回 Activity 时重建 Activity 对象。但用户并不知道系统销毁 Activity 后又对其进行了重建,因此他们很可能认为 Activity 状态毫无变化。 在这种情况下,您可以实现另一个回调方法对有关 Activity 状态的信息进行保存,以确保有关 Activity 状态的重要信息得到保留:onSaveInstanceState()。

    系统会先调用 onSaveInstanceState(),然后再使 Activity 变得易于销毁。系统会向该方法传递一个 Bundle,您可以在其中使用 putString() 和 putInt() 等方法以名称-值对形式保存有关 Activity 状态的信息。然后,如果系统终止您的应用进程,并且用户返回您的 Activity,则系统会重建该 Activity,并将 Bundle 同时传递给 onCreate() 和 onRestoreInstanceState()。您可以使用上述任一方法从 Bundle 提取您保存的状态并恢复该 Activity 状态

    启动 Activity

    启动 activity 有 Class 的方式,action 的方式和 scheme 的方式,前两种方式比较常用不再介绍,着重介绍下通过 scheme 启动 activity。

    scheme 启动方式我们可以直接看 这里 或者看 Intent.parseUri() 源码。 

    相关文章

      网友评论

          本文标题:Activity

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