Activity的生命周期 

1.正常情况下的生命周期

  1. onCreate:  Activity正在被创建,生命周期中的第一个方法,常在此方法中做一些初始化工作,比如调用setContentView方法,初始化Activity所需数据等。
  2. onRestart:  表示Activity正在重新启动。一般情况下,当Acivity从不可见重新变为可见状态时,onRestart方法就会被调用。
  3. onStart:  表示Activity正在被启动,这是Activity已经可见,但是没有出现在前台,还无法与用户交互。
  4. onResume:  表示Activity可见并出现在前台开始活动。onStart和onResume都表示Activity可见,但是onStart的时候Activity还在后台,onResume时Activity才显示到前台。
  5. onPause:  Activity正在停止,此时可以做一些存储数据、停止动画等工作。但注意不能太耗时,因为会影响到新Activity的显示,onPause必须先执行完,新Activity的onResume才能执行。
  6. onStop:  Activity即将停止,可以做一些稍微重量级的回收工作,同样不能太耗时。
  7. onDestory:  Activity即将被销毁,在这里,做一些回收工作和资源的释放。

      

Activity的生命周期切换过程

  关于onStart和onResume、onPause和onStop的不同,onStart和onStop是从Activity是否可见这个角度来回调,onResume和onPause是从Activity是否位于前台这个角度来回调的,除了这种区别,在实际使用中没有其他明显的区别。

2.异常情况下的生命周期分析

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

  

异常情况下Activity的重建过程

  当手机旋转屏幕时,系统配置方式发生边,在默认情况下Activity就会被销毁并且重新创建。当系统配置发生改变后,Activity会被销毁,其onPause、onStop、onDestory均会被调用,同时由于Activity是在异常情况下终止的,系统会调用onSaveInstanceState来保存当前Activity的状态(正常情况下系统不会调用这个方法)。这个方法调用时机在onStop之前,和onPause没有时序关系(可能在onPause之前也可能之后)。当Activity被重新创建之后,系统会调用onRestoreInstanceState,并且把Activity销毁时onSaveInstanceState保存的bundle传给onRestoreInstanceState和onCreate方法。可以通过bundle是否为空来判断Activity是否被重建了。如果被重建了,可以取出之前保存的数据并恢复,从时序上来讲,onRestoreInstanceState的调用时机在onStart之后。一般情况下,旋转屏幕后Activity会重新创建。但是当设置Activity的configChanges属性为orientation|screenSize之后Activity不会重新创建。

3.Activity的启动模式LaunchMode

  1. standard(标准模式):  也是系统的默认模式,每次启动一个Activity都会重新创建一个新的实例,不管这个实例是否已经存在。onCreate、onStart、onResume都会被调用。
  2. singleTop(栈顶复用模式)  在这种模式下,如果新Activity的实例已经位于任务栈的栈顶,那么此Activity不会被重新创建,同时回调它的onNewIntent方法,通过此方法的参数我们可以去除当前请求的信息。需要注意,这个Activity的onCreate、onStart方法不会被重新调用。如果新Activity的实例已经存在但不是位于栈顶,那么新Activity仍然会重新创建。
  3. singleTask(栈内复用模式)  这是一种单例模式,在这种模式下,只要Activity在一个栈中存在,那么多次启动此Activity都不会重新创建实例,和singleTop一样,系统也会回调其onNewIntent方法。如果栈中有这个实例,那么会将该实例之上的Activity全部弹出栈,将该实例置于栈顶。
  4. singleInstance(单实例模式)  这是一种加强的singleTask模式,除了具有singleTask模式的所有特性之外,还加强了一点,就是具有此模式的Activity只能单独的位于一个任务栈中。

4.Activity的Flags

  FLAG_ACTIVITY_NEW_TASK

  这个标记位的作用是为Activity指定“singleTask”启动模式,其效果和在XML中指定该模式相同。

  FLAG_ACTIVITY_SINGLE_TOP

  这个标记位的作用是为Activity指定“singleTop”启动模式,其效果和在XML中指定该模式相同。

  FLAG_ACTIVITY_CLEAR_TOP

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

5.IntentFilter的匹配规则

  隐式调用需要Intent能够匹配目标组件的IntentFilter中所设置的过滤信息,如果不匹配将无法启动目标Activity。IntentFilter中的过滤信息有action、category、data。一个Intent只有同时匹配action类别、category类别、data类别才算完全匹配。另外,一个Activity中可以有多个intent-filter,一个Intent只要能匹配任何一组intent-filter即可成功启动对应的Activity。

  1.action的匹配规则

  action是一个字符串,系统预定义了一些action,我们也可以在应用中定义自己的action。action的匹配要求Intent中的action存在且必须和过滤规则中的其中一个action相同,这里需要注意和category匹配规则的不同。action区分大小写,大小写不同字符串相同的action会匹配失败。

  2.category的匹配规则

  Intent中如果有category,那么所有的category都必须和过滤规则中的其中一个category相同。当然,Intent中可以没有category,但它仍然可以匹配成功,原因是系统在调用startActivity和startActivityForResult的时候会默认为Intent加上“android.intent.category.DEFAULT”这个category。同时为了我们的activity能够接收隐式调用,就必须在intent-filter中指定“android.intent.category.DEFAULT”这个category。

  3.data的匹配规则

  data由两部分组成,mimeType和URI。mimeType指媒体类型,比如image/jpeg、audio/mpeg4-generic和video/*等,而URI中包含的数据就比较多了。下面是URI的结构:

    <scheme>://<host>:<port>/[<path>|<pathPrefix>|<pathPattern>]

  Scheme:  URI的模式,比如http、file、content等,如果URI中没有指定scheme,那么整个URI是无效的。

  Host:  URI的主机名,比如www.biadu.com

  Port:  URI中的端口号

  Path、pathPattern和pathPrefix:  这三个参数表述路径信息,其中path表示完整的路径;pathPattern也表示完整的路径信息,但是它里面可以包含通配符;pathPrefix表示路径的前缀信息。

  最后,当我们通过隐式方式启动一个Activity的时候,可以做一下判断,看是否有Activity能够匹配我们的隐式Intent。判断方法有两种:采用PackageManager的resolveActivity方法或者Intent的resolveActivity方法如果找不到匹配的Activity就会返回null。

参考自《Android开发艺术探索》

转载于:https://www.cnblogs.com/knabe/p/7661170.html

Activity随笔相关推荐

  1. 最新android跨进程通信的库,Android随笔之——跨进程通信(一) Activity篇

    在Android应用开发中,我们会碰到跨进程通信的情况,例如:你用QQ通讯录打电话的时候会调用系统的拨号应用.某些新闻客户端可以将新闻分享到QQ.微信等应用,这些都是跨进程通信的情况.简而言之,就是一 ...

  2. Android 组件系列-----Activity的传值和回传值

    在这篇随笔里将讲解Activity的传值和回传值. 一.通过startActivity来进行Activity的传值 在Android中,如果我们要通过一个Activity来启动另一个Activity, ...

  3. mysql sign_mysql - 随笔分类 - signheart - 博客园

    随笔分类 - mysql 摘要:有一个项目需要存储ios的表情(emoji表情)这种表情虽然是utf8编码,但是一个字符需要占用4个字节,而MySQL utf8编码只能存放3字节的字符.在MySQL ...

  4. 随笔 - Andriod

    随笔分类 - Andriod android-4.2.1_r1 Porting PPPoE 摘要: 由于Android已经有pppd(external/ppp/pppd),需要移植pppoe.配置Li ...

  5. Android组件系列-----Activity保存状态

    本篇随笔将详细的讲解Activity保存状态的概念,也就是saving activity state. 一.Activity状态保持概念 保存Activity的状态是非常重要的,例如我们在玩一个游戏的 ...

  6. Android 组件系列-----Activity生命周期

    本篇随笔将会深入学习Activity,包括如何定义多个Activity,并设置为默认的Activity.如何从一个Activity跳转到另一个Activity,还有就是详细分析Activity的生命周 ...

  7. Android 组件系列-----Activity保存状态

    本篇随笔将详细的讲解Activity保存状态的概念,也就是saving activity state. 一.Activity状态保持概念 保存Activity的状态是非常重要的,例如我们在玩一个游戏的 ...

  8. android模拟按键方法,Android随笔之——模拟按键操作的几种方式

    前几天转过一篇Android上模拟按键操作.触屏事件的博客,昨天又去找了百度.谷歌了一下,写了一点简单的测试代码,留待不时之需.有需要看之前转载的那篇博客的请看这里→_→转:Android随笔之--使 ...

  9. Android系列之Activity的传值和回传值

    Android系列之Activity的传值和回传值 Android 组件系列之Activity的传值和回传值 在这篇随笔里将讲解Activity的传值和回传值. 一.通过startActivity来进 ...

最新文章

  1. SQL 数据库的使用
  2. linux网络配置命令笔记,初学者学习linux笔记与练习-第二天。一些基本命令以及初级网络配置...
  3. 200825C文件 复习
  4. matplotlib.lines.Line2D
  5. Linux四剑客详解——awk
  6. 01分数规划解析(转载)
  7. 【大数据干货】基于Hadoop的大数据平台实施——整体架构设计
  8. 创智播客微服务_传智播客黑马程序员首次对外发布JavaEE中级程序员学习路线图...
  9. c++11新特性介绍
  10. 单片机中code、data、idata、xdata等关键字意思
  11. android跳转qq群代码,Android app 跳 QQ 群界面
  12. ssm智能餐厅菜品厨位分配管理系统 java
  13. uniapp 小程序用高德地图sdk
  14. 7.3 有源滤波电路(2)
  15. 移动群智感知应用学习
  16. for循环不执行的小坑
  17. 布朗大学计算机专业怎么样,布朗大学计算机工程研究生怎么样?好不好
  18. 工业互联网方兴未艾,做好工业现场数据管理是破局关键
  19. 挖矿病毒 qW3xT.2 最终解决方案
  20. 石家庄铁道大学毕业设计计算机,石家庄铁道大学毕业设计.doc

热门文章

  1. 聪明人:三不管,四不说,五不帮!
  2. 山东财经大学计算机体系结构考试题,2016年山东财经大学计算机科学与技术学院数据库系统原理与程序设计复试笔试仿真模拟题...
  3. 2017交大计算机专业分数线,2017上海交大录取分数线历年录取分(2)
  4. mysql5.7 json特性_mysql5.7新增加的JSON数据类型特征介绍
  5. 基因突变PHP6,基因突变中那些“披着狼皮的羊” 很多“致命性”基因突变正在被证实无害...
  6. 华为hs8145v5如何改桥接_口译vlog | 跟我一起去华为东莞“欧洲小镇”吧!
  7. 各部件作用计算机,计算机硬件有哪些部件,各部件的作用是什么?
  8. linux 5.5 外接usb2.0硬盘,RHEL5 使用pam_usb
  9. 安卓app开发工具_手机APP开发会涉及到哪些知识点呢?
  10. java堆排序工具包_JAVA 排序工具类