第一章 生命周期和启动模式

本文为Android开发艺术探索的笔记,仅供学习

第一章知识点大纲

1 android的典型与异常生命周期分析

1.1 典型生命周期分析

七个生命周期函数

  • onCreate(): 做一些初始化的工作,会调用setContentView去加载布局资源,如果bundle有数据可以获取
    bundle里的数据(一般是在onSaveInteneceState去储存bundle)
  • onRestart():一般是再次启动是调用
  • onStart():可以理解为显示视图,当前Activity在可见进程,可见但不可交互
  • onResume():可以理解为获取焦点,当前Activity在前台进程,可见可以交互
  • onPause():可以理解为失去焦点消失焦点 可以来储存一些信息 对象不能太大 否则会影响到下一个页面的显示
  • onStop():可以理解为消失视图
  • onDestroy():Activity的销毁

几种生命周期函数调用的情况

  1. 当打开Activity A 的时候 会调用 onCreate(A) onStart (A)onResume(A)
  2. 当前是在A页面,要打开新的Activity B 或者返回桌面的时候,
    会调用 onPause (A) onCreate(B) onStart (B)onResume(B) onStop(A)
    注: 如果A是采用透明主题 则不会调用onStop
  3. 当用户返回A 的时候(或者按BACK) 会调用 onPause (B) onRestart(A) onStart (A)onResume(A) onStop(B)onDestroy(B)

对于整个生命周期来说 onCreate~onDestroy onStart~onStop onResume~onPause 这些都是一一对应的

1.2 异常生命周期分析

1.2.1 资源相关的系统配置发生改变导致Activity被杀死并重新建立

比如我们要去加载一张图片,我们先要把图片放在Drawable的文件夹下面,想要去加载图片,需要通过Resources去获取这张图片,我们在放图片的同时,需要根据不同的手机分辨率把图片放在想要的分辨率的Drawable的文件夹下面。当我们没有去设备Activity的configchange的时候,Activity的反转会导致Activity会被销毁并且重新加载如果我们不做处理,默认的生命周期是如下图


onSaveInstanceState的作用就是 可以通过bundle来存储一些数据 当Activity被销毁且重新创建的时候会去调用,onCreate 和onRestoreInstanceState 的方法去获取 onSaveInstanceState用来储存数据的对象bundle,从而去恢复被销毁前保留的信息。

注:onSaveInstanceState的调用时机是在onStop之前,与onPause没有时序关系,并且正常情况下是不调用onSaveInstanceState,仅在Activity被异常终止的时候调用。

我们在调用onSaveInstanceState的同时要理解,系统会默认帮我们保存当前的View的视图结构,比如文本框输入的信息,Listview滚动的位置等。

下面我们来看下Textview的源码

 public Parcelable onSaveInstanceState() {
        Parcelable superState = super.onSaveInstanceState();

        // Save state if we are forced to  
        final boolean freezesText = getFreezesText();//用于判断是否内容的
        boolean hasSelection = false; //用于判断是否滚动
        int start = -1;
        int end = -1;//用于记录滚动位置的起始和末尾的位置
      
        if (mText != null) {判断内容是否为空
            start = getSelectionStart();
            end = getSelectionEnd(); 
            if (start >= 0 || end >= 0) {
                // Or save state if there is a selection
                hasSelection = true;
            }
        }

        if (freezesText || hasSelection) {//判断控件是否有内容,是否有滚动
            SavedState ss = new SavedState(superState);
            //SavedState 是用于保存状态的
            if (freezesText) {
                if (mText instanceof Spanned) {
                    final Spannable sp = new SpannableStringBuilder(mText);

                    if (mEditor != null) {
                        removeMisspelledSpans(sp);
                        sp.removeSpan(mEditor.mSuggestionRangeSpan);
                    }

                    ss.text = sp;//将内容保存起来
                } else {
                    ss.text = mText.toString();
                }
            }

            if (hasSelection) {
                // XXX Should also save the current scroll position!
                ss.selStart = start;
                ss.selEnd = end;//保存滚动的位置
            }

            if (isFocused() && start >= 0 && end >= 0) {
                ss.frozenWithFocus = true;
            }

            ss.error = getError();

            if (mEditor != null) {
                ss.editorState = mEditor.saveInstanceState();
            }
            return ss;//将状态进行返回
        }

        return superState;
    }

1.2.2 资源内存不够导致低优先级被Activity被杀死

首先我们需要了解几个进程

  • 前台进程:前台进程是Android系统中最重要的进程,是与用户正在交互的进程
  • 可见进程:可见进程指部分程序界面能够被用户看见,却不在前台与用户交互。
  • 服务进程:一个包含已启动服务的进程就是服务进程,服务没有用户界面,不与用户直接交互,但能够在后台长期运行,提供用户所关心的重要功能
  • 后台进程:已被暂停的Activity,比如执行了onStop
  • 空进程:空进程是不包含任何活跃组件的进程。在系统资源紧张时会被首先清除。

优先级从左到右 从大到小
前台进程>可见进程>服务进程>后台进程>空进程
因此对于一些独立运行在后台的进程很容易被杀死,所以就要把进程放在Service中,可以保证进程的优先级。

2 启动模式分析

2.1 四种启动模式分析

启动模式 一共有四个 standard(标准模式) singleTask(栈内复用模式) singleTop(栈顶复用模式)singleInstantce(单实例模式)

  • standard:每启动一次就会重写创建一个新的实例,无论这个实例是否存在都会创建。如 a启动b 那边b会添加到a的栈内,栈内为 a b,重复添加b,那么栈内为 a b b b
  • singleTop:栈顶复用模式,也就是说当前栈内是ABC 若要再次启动C(C为singleTop模式)则C不会再创建,因为栈顶的C已经存在了。 栈列 ABC 当前栈内是ABD 若启动C(C为singleTop模式)则C会再创建 栈内为ABDC。也就是说当栈顶不是要启动的对象,则会重新创建就等于standard模式 ,若栈顶和要启动的对象一样则不再创建。
  • singleTask:



注:当启动模式为singleTask和singleTop的时候,该模式下的Activity被切换到栈顶的时候,会调用onNewIntent

  • singleIntance: 当前有A B C,C的启动模式是singleIntance,这三个Activity 先启动A ,A添加到任务栈1中,在启动C,C则添加到任务栈2中,在启动B,B添加到任务栈1中,现在有两个任务栈 1和2 ,1中有A B,2中有C当第一次按Back的时候,任务栈1中的B退出,再按一次Back,A退出,最后才是C退出。 当被设置为该模式下(singleIntance)的时候,都会被添加到新的任务栈中去

任务栈其实是有名字的,一般默认为应用的包面,但是可以通过TaskAffinity去设置任务栈的名字
<activity android:name=".Okhttp_downapk" android:taskAffinity="com.abc.task1"/>

  1. 当TaskAffinity和SingleTask结合使用的时候,则该模式下的Activity启动的时候,会被添加到与TaskAffinity相同的任务栈中去
  2. 当TaskAffinity和allowTaskReparenting结合使用的时候,会产生特殊的效果。

举个例子,应用A启动了应用B的 C Activity,且C Activity的allowTaskReparenting为true的时候,然后按Home,在去点击应用B,则应用B显示的会是C Activity,C会从应用A的堆栈中移到应用B的堆栈中去。

2.2 Activity的Flags

使用如下
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
直接上图 书中分析的很详细


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容