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

  1.1Activity的生命周期全面解析

    1.1.1典型情况下的生命周期分析

    (1)在两个Activity进行切换时,当前的Activity的onPause()方法必须先执行完,新Activity的onResume()方法才会执行。

     (2)当用户打开新的Activity或者切换到桌面的时候,回调如下:onPause->onStop。这里有一种特殊情况,如果新 Activity采用了透明主题,那么当前Activity不会回调onStop,所以应该尽量避免在onPause中执行耗时的操作,onStop可以 做一些稍微重量级的回收工作,同样不能太耗时。

    1.1.2异常情况下的声明周期分析

    异常情况(比如资源相关的系统配置发生变化或者系统内存不足)

    1资源相关的系统配置发生变化(屏幕横竖屏切换)

     默认情况下,旋转手机屏幕Activity会被销毁重建,其onPause,onStop,onDestroy均会被调用,同时由于 Activity是在异常情况下终止的,系统会调用onSaveInstanceState来保存当前Activity的状态。这个方法的调用时机是在 onStop之前,它和onPause没有既定的时序关系。这个方法只会出现在Activity被异常终止的情况下,正常情况系统不会调用这个方法。当 Activity被重新创建后,系统会调用onRestoreInstanceState,并把Activity销毁时 onSaveInstanceState方法所保存的Bundle对象作为参数同时传递给onRestoreInstanceState和 onCreate方法。所以可以通过onSaveInstanceState和onRestoreInstanceState方法来判断Activity 是否被重建了。从时序上说,onRestoreInstanceState的调用时机在onStart之后。

    Activity被重 新创建后参数Bundle的接收位置可以选择onRestoreInstanceState和onCreate,二者的区别 是:onRestoreInstanceState一旦被调用,其参数savedInstanceState一定是有值的,不必额外判断时候为空;但 onCreate不行,onCreate如果是正常启动的话,其参数savedInstanceState为null,所以必须要额外判断。官方建议在 onRestoreInstanceState中进行数据的恢复。

    再次注意一点:系统只在Activity异常终止的时候才会调用onSaveInstanceState和onRestoreInstanceState方法来存储和恢复数据,其他情况不会触发这个过程。

    2内存不足导致低优先级的Activity被杀死

    Activity的优先级由高到低分三种:

    1前台Activity;

    2可见但非前台(比如Activity中弹出了一个对话框);

    3后台Activity;

    如果一个进程没有四大组件在运行,那么它将会很快被杀死,所以,最好是将后台工作放在service中保证进程有一定的优先级,这样就不会轻易的被系统杀死。

  如果不想让Activity在屏幕旋转时重新创建,可以给该Activity添加如下属性:

//4.0以下版本
android:configChanges=“orientation”
//4.0以上版本
android:configChanges=“orientation|screenSize”

  

  1.2Activity的启动模式

    1.2.1 Activity的LaunchMode    

    Activity的四种启动模式:standard,singleTop,singTask,singInstance。

    (1)standard—标准模式

    系统默认的模式,每次启动一个Activity都会重新创建一个新的实例,不管这个实例是否已经存在。(注意使用ApplicationContext启动Activity会报AndroidRuntimeException(比如在广播接收器中),这是因为Context没有任务栈无法让Activity加入所致,解决办法是在Activity启动时指定FLAG_ACTIVITY_NEW_TASK标记位,这个时候Activity是以singTask模式启动的)。

    (2)singTop—栈顶复用模式

    如果新Activity已经位于任务栈的栈顶,那么此Activity不会被重新创建,同时会触发onNewIntent方法。

    (3)singleTask—栈内复用模式

    只要Activity在栈内存在,那么多次启动此Activity都不会创建新的Activity实例,onNewIntent方法同样会被触发。(注意该模式具有cleartop的效果,会导致栈内所有在该Activity上面的Activity全部出栈,例如ABCD代表一个任务栈S内的四个Activity,A位于栈底D位于栈顶,如果B为singleTask模式,那么重新启动B后栈内会变为AB,CD会被移出栈)

    (4)singleInstance—单实例模式

    一种加强的singleTask模式,具有此种模式的Activity只能单独的位于一个任务栈中,后续的请求均不会创建新的Activity,除非这个独特的任务栈被系统销毁。

  Activity指定启动模式的两种方法:
    (1)AndroidManifest.xml制定(P20文件写错了)    

       <activity
android:name=".MainActivity"
android:configChanges="orientation|screenSize"
android:label="@string/app_name"
android:launchMode="singleTop"
android:theme="@style/AppTheme.NoActionBar">

    (2)Intent设置标志位    

Intent intent=new Intent();
intent.setClass(MainActivity.this,SecondActivity.class);
intent.setFlags(Inent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);

    注意第二种的优先级要高于第一种,当两种同时存在时,以第二种方式为准;

    1.2.2 Activity的Flags

    几个常用的标记位    

    (1)FLAG_ACTIVITY_NEW_TASK  为Activity指定singleTask启动模式。

    (2)FLAG_ACTIVITY_SINGLE_TOP  为Activity指定singleTop启动模式。

    (3)FLAG_ACTIVITY_CLEAR_TOP  具有此标记位的Activity当它启动时,在同一个任务栈中所有位于它上面的Activity都要出栈。

    (4)FlAG_ACTIVITY_EXCLUDE_FROM_RECENTS 具有这个标记的Activity不会出现在历史Activity列表中,等同于android:excludeFromRecents="true";

  1.3IntentFilter的匹配规则

    IntentFilter中的过滤信息有三种,分别是action,category,data,一个IntentFilter中action,category,data可以有多个,一个Activity中可以有多个IntentFilter,一个Intent只要能匹配任何一组IntnetFilter就可以成功启动。

    1.action的匹配规则

    Intent中的action存在且必须和过滤规则中的其中一个action相同,这里说的匹配是指action中的字符串值完全一样,所以action是区分大小写的。

    2.category的匹配规则

    Intent中只要有category,不管有几个,每个都要能够和过滤规则中的任何一个category相同,Intent中不设置category也可以匹配。

    3.data的匹配规则

    和action类似,过滤规则中定义了data,Intent中也要定义可匹配的data。

  Intent-filter的匹配规则对于Service和BroadcastReceiver也是同样的道理,不过系统对于service的建议是尽量使用显式调用方式来启动服务。

Android开发艺术探索学习笔记(一)的更多相关文章

  1. Android开发艺术探索学习笔记(三)

    第三章  View的事件体系 3.1 View基础知识 3.1.1 什么是view View 是Android中所有控件的基类,是一种界面层的控件的一种抽象,它代表了一个控件. 3.1.2 View的 ...

  2. Android开发艺术探索学习笔记(十一)

    第十一章  Android的线程和线程池 从用途上来说,线程分为子线程和主线程,主线程主要处理和界面相关的事情,而子线程往往用于执行耗时的操作.AsyncTask,IntentService,Hand ...

  3. Android开发艺术探索学习笔记(十)

    第十章  Android的消息机制 面试中经常会被问到的一个问题:handler是如何在子线程和主线程中进行消息的传递的,这个问题通过了解Android的消息机制可以得到一个准确的答案. Androi ...

  4. Android开发艺术探索学习笔记(六)

    第六章 Android的Drawable  Drawable的优点:使用简单,比自定义view的成本要低:非图片类型的Drawable占用空间小,有利于减小APK安装包的大小. 6.1Drawable ...

  5. Android开发艺术探索学习笔记(四)

    第四章 View的工作原理 4.1初识ViewRoot和DecorView ViewRoot是连接WindowManager和DecorView的纽带,View的三大流程均是通过ViewRoot来完成 ...

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

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

  7. Android开发艺术探索读书笔记——进程间通信

    1. 多进程使用场景 1) 应用某些模块由于特殊需求须要执行在单独进程中. 如消息推送,使消息推送进程与应用进程能单独存活,消息推送进程不会由于应用程序进程crash而受影响. 2) 为加大一个应用可 ...

  8. android开发艺术探索学习 之 结合Activity的生命周期了解Activity的LaunchMode

    转载请标明出处: http://blog.csdn.net/lxk_1993/article/details/50749728 本文出自:[lxk_1993的博客]: 首先还是先介绍下Activity ...

  9. android开发艺术探索读书笔记之-------view的事件分发机制

    View的点击事件的分发,其实就是对MotionEvent事件的分发过程,即当一个MotionEvent产生后,系统需要把这个事件传递给一个具体的View,而这个过程就是分发过程. 分发过程主要由以下 ...

随机推荐

  1. Js Select动态添加Option

    var now = new Date(); function setDate(type, id, from, to) { var str = ""; for (var i = fr ...

  2. Linux入门(1)——Ubuntu16.04安装搜狗拼音

    在网址下载搜狗deb包:http://pinyin.sogou.com/linux/ 将下载的sogoupinyin_2.1.0.0082_amd64.deb放在根目录下. 安装搜狗拼音: ltq@l ...

  3. redis之hello

    1.创建一个maven工程 2.进入redis官网 https://github.com/xetorthio/jedis 3.找到 <!--导入到pom.xml文件中--><depe ...

  4. 在Ubuntu上安装pyenv

    因为找到一个域名枚举的脚本使用Python3编写的,而我一直习惯的是使用Python2.7,在自己的Windows7上再安装个Python怕混了,于是想着在VPS上装个Python的版本管理工具,也方 ...

  5. lca tarjin

    这个算法  我个人认为是  遍历每一个点把它当成一些询问的最近祖先 1 2 3 4 5 6 low是并差集,vis是是否访问过,访问过为true,没有为false: 假设询问是(4,4),(4,5), ...

  6. [kuangbin]树链剖分 C - Tree

    和平常的树链剖分维护边权不同的地方在于对线段树的要求较高 NEGATE 反转区间,也就是a - b 内所有的边权取相反数 而Query询问是最大值,所以也就是维护可取反区间的最大值问题 需要维护的值是 ...

  7. Excel中单元格、超级链接形成超级链接单元格

    使用函数 HYPERLINK(超链接,显示文字) =HYPERLINK("http://www.cnblogs.com/Vpygamalion/","李汉超") ...

  8. IIS日志存入数据库之二:ETW

    在上一篇文章<IIS日志存入数据库之一:ODBC>中,我提到了ODBC方式保存的缺点,即:无法保存响应时间以及接收和响应的字节数. 如果一定要获取响应时间以及接收和响应的字节数的话,就要另 ...

  9. 为什么主流的 App 看起来都差不多?这可能是件好事

    欢迎访问网易云社区,了解更多网易技术产品运营经验. 现在设计师可以把精力都花在真正有意义的地方了. 打开Instagram.Airbnb.Apple Music.Twitter.Dropbox或Lyf ...

  10. Java基础巩固——反射

    什么是反射 反射机制就是指程序运行时能够获取自身的信息.在Java中,只要给出类的名字,就可以通过反射机制来获取类的信息 哪里用的到反射机制 在jdbc中就是使用的反射来实例化对象,比如:Class. ...