内容来源:Android开发艺术探索第一章:Activity的生命周期与启动模式

  • 不能在onPause中做重量级的操作,因为必须执行完成以后新Activity才能Resume。onPauseonStop都不能执行耗时的操作,尤其是onPause.这就意味着,我们应当尽量在onStop中做操作,而使得新Activity尽快显示出来并切换到前台。

  • onSaveInstanceStateonRestoreInstanceState:Android保存数据的机制。Activity被销毁后调用onSaveInstanceState来保存数据,重新创建时在onCreateonRestoreInstanceState中恢复存储的数据。 系统只在Activity异常终止的时候才会调用onSaveInstanceStateonRestoreInstanceState来存储和恢复数据,其他情况不会触发这个过程。如Activity正常销毁时不会触发。

  • 当系统配置改变后(如横竖屏切换),Activity会重新创建。若要不让它重新创建,可以给Activity指定configChanges属性。如
    android:configChanges="orientation",设置屏幕旋转时Activity不重新创建。| 号可连接多个值,如
    android:configChanges="orientation|keyboardHidden"

  • Activity的LaunchMode

    1. standard : 标准模式,系统的默认模式。Context类型启动standard模式的Activity会报错。因为standard模式的Activity默认会进入启动它的Activity所属任务栈中,而非Activity类型的Context并没有任务栈。故需为待启动的Activity指定FLAG_ACTIVITY_NEW_TASK标志位,以使启动时候为它创建一个新的任务栈。
    2. singleTop : 栈顶复用模式。若新Activity已经位于任务栈的栈顶,则此Activity不会被重新创建。onNewIntent方法会被回调。
    3. singleTask : 栈内复用模式。只要Activity在一个栈中存在,则多次启动该Activity都不会重新创建实例。设Activity为A,启动时,先寻找是否存在A所想要的任务栈,若不存在,创建新任务栈并把A实例放入栈中。若存在A所需的任务栈,则看A在任务栈中,是否已经有实例存在,若有实例存在,则将A调到栈顶并调用onNewIntent方法。若无实例存在,则创建实例压入栈中。此外,singleTask默认具有clearTop效果,即任务栈S1,情况为ADBC,启动D,则D上面的Activity全部出栈,此时S1:AD。
    4. singleIntance : 单实例模式。加强的singleTask,具备singleTask所有特性,还特殊的,此种模式的Activity都单独位于一个任务栈中。此种模式的Activity A启动后,会创建一个新的任务栈,A独自在该Activity中,由于栈内复用的特性,后续请求都将不会创建新的Activity,除非这个独特的任务栈被系统销毁了。
  • 给Activity指定启动模式

    • 方式一:通过AndroidManifest指定
      android:launchMode="singleTask"
    • 方式二:在Intent中设置标志位
      intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)

    • 区别:优先级方式二高于方式一;限定范围不同。

  • TaskAffinity属性: 该属性标识了一个Activity所需要的任务栈的名字。默认情况下,所有Activity所需任务栈名字为应用包名。若单独为Activity 指定一个与包名不同的TaskAffinity属性值,则启动该Activity时,若不存在与该属性值同名的任务栈,则会创建一个新的以该属性值命名的任务栈。

  • adb shell dumpsys activity : 检测Activity任务栈

  • Activity的Flags 几种常见标志位

    • FLAG_ACTIVITY_NEW_TASK : 与为Activity指定 "singleTask”启动模式相同
    • FLAG_ACTIVITY_SINGLE_TOP:与为Activity指定 "singleTop”启动模式相同
    • FLAG_ACTIVITY_CLEAR_TOP:具有此标志位的Activity,启动时再同一个任务栈中所有位于他上面的Activity都要出栈。若被启动Activity采用standard模式启动,则它连同它之上的Activity都要出栈,系统会创建新的Activity实例并放入栈顶。若和singleTask一起出现,若被启动Activity实例已经存在,系统会调用onNewIntent。
    • FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS : 具此标志的Activity不会出现在历史Activity的列表中,当某些情况不希望用户通过历史列表回到我们的Activity时使用。等同于在xml中指定Activity属性 android:excludeFromRecents="true"

Android开发艺术探索笔记之Activity的更多相关文章

  1. Android开发艺术探索笔记——第一章:Activity的生命周期和启动模式

    Android开发艺术探索笔记--第一章:Activity的生命周期和启动模式 怀着无比崇敬的心情翻开了这本书,路漫漫其修远兮,程序人生,为自己加油! 一.序 作为这本书的第一章,主席还是把Activ ...

  2. Android开发艺术探索笔记——View(二)

    Android开发艺术探索笔记--View(二) View的事件分发机制 学习资料: 1.Understanding Android Input Touch Events System Framewo ...

  3. Android开发艺术探索笔记—— View(一)

    Android开发艺术探索笔记 --View(一) View的基础知识 什么是View View是Android中所有控件的基类.是一种界面层控件的抽象. View的位置参数 参数名 获取方式 含义 ...

  4. ViewRoot,DecorView,MeasureSpec和View的工作原理——Android开发艺术探索笔记

    原文链接 http://sparkyuan.me/ 转载请注明出处 View的绘制流程是从ViewRoot的performTraversals方法開始的.它经过measure.layout和draw三 ...

  5. Android中View的事件分发机制——Android开发艺术探索笔记

    原文链接 http://sparkyuan.me/ 转载请注明出处 介绍 点击事件的事件分发就是对MotionEvent事件的分发过程.当一个MotionEvent产生了以后,系统须要把这个事件传递给 ...

  6. Android开发艺术探索读书笔记——01 Activity的生命周期

    http://www.cnblogs.com/csonezp/p/5121142.html 新买了一本书,<Android开发艺术探索>.这本书算是一本进阶书籍,适合有一定安卓开发基础,做 ...

  7. 《Android开发艺术探索》读书笔记 (13) 第13章 综合技术、第14章 JNI和NDK编程、第15章 Android性能优化

    第13章 综合技术 13.1 使用CrashHandler来获取应用的Crash信息 (1)应用发生Crash在所难免,但是如何采集crash信息以供后续开发处理这类问题呢?利用Thread类的set ...

  8. 《Android开发艺术探索》读书笔记 (9) 第9章 四大组件的工作过程

    第9章 四大组件的工作过程 9.1 四大组件的运行状态 (1)四大组件中只有BroadcastReceiver既可以在AndroidManifest文件中注册,也可以在代码中注册,其他三个组件都必须在 ...

  9. 《android开发艺术探索》读书笔记(十五)--Android性能优化

    接上篇<android开发艺术探索>读书笔记(十四)--JNI和NDK编程 No1: 如果<include>制定了这个id属性,同时被包含的布局文件的根元素也制定了id属性,那 ...

随机推荐

  1. Activity 怎么和 Service 绑定,怎么在 Activity 中启动自己对应的 Service?

    Activity 通过 bindService(Intent service, ServiceConnection conn, int flags)跟 Service 进行绑定,当绑定成功的时候 Se ...

  2. linux 下的快捷键操作

    概述 今天发现自己码代码的效率有点低,所以查找了一下 linux 常用的快捷键操作,记录下来,供以后开发时参考,相信对其他人也有用. linux 终端常用快捷键 tab:补全命令 Ctrl + u:剪 ...

  3. Android 动态申请权限

    AndroidManifest.xml(清单文件)添加需要的权限 <uses-permission android:name="android.permission.ACCESS_CO ...

  4. Linux环境Nginx安装

    开始前,请确认gcc g++开发类库是否装好,默认已经安装. ububtu平台编译环境可以使用以下指令 apt-get install build-essential apt-get install ...

  5. 三十:数据库之定义ORM模型,并映射到数据库

    连接数据库操作 sqlalchemy映射步骤: 1.创建ORM模型,这个模型必须继承sqlalchemy提供的基类2.在这个ORM模型中创建一些属性,与表中的字段一一映射,这些属性必须是sqlalch ...

  6. oracle系统视图V$

    --数据字典表select * from v$fixed_table;select * from v$fixed_view_definition;select * from dictionary; - ...

  7. 用Node开发桌面应用:NW.js和Electron

    NW.js和Electron对比:[http://tangiblejs.com/posts/nw-js-electron-compared] NW.js:[https://nwjs.io/] Elec ...

  8. HtML5与CSS3基础

    HTML标签 1.<a></a> 超链接标签 属性 href:跳转页面的连接 name:实现定锚功能,跳转同一页面不同位置(例返回顶部) target: (self, pare ...

  9. https原理以及golang基本实现

    关于https 背景知识 密码学的一些基本知识 大致上分为两类,基于key的加密算法与不基于key的加密算法.现在的算法基本都是基于key的,key就以一串随机数数,更换了key之后,算法还可以继续使 ...

  10. Angular5 tslint错误:The selector of the component “XXXComponent” should be used as element

    错误描述 在项目中自己封装了一个 select 组件 @Component({ selector: '[app-choosen-select]', templateUrl: './selectcomm ...