android开发艺术探索笔记--第一章:Activity的生命周期和启动模式

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

Activity的生命周期全面分析

è¿éåå¾çæè¿°

1.activity 第一次启动的时候,回调如下:onCreate ——> onStart ——> onResume

2. 当用户打开新的activity或者切换到桌面的时候,回调如下::onPause ——> onStop ——> 

这里有一种特殊情况,如果新的activity采取了透明的主题,那么当前activity不会回调onStop

3.当用户再次回到原来的activity,回调如下:onRestart ——> onStart ——> onResume

4.当用户按back键的时候,回调如下:onPause ———> onStop ——> onDestroy

5.当activity被系统回收的时候再次打开,生命周期和1是一样的。

但是需要注意的是,只是生命周期一样,不代表所有的进程都是一样的;

6. onCreate和onDestroy对应;

onStart和onStop是配套的

onResume和onPause是配套的

onStart和onStop ,onResume和onPause ,这两者的区别在于activity是否可见,其他大体一样

.假设当前Activity为A,如果用户打开了一个新的Activity为B,那么系统会先调用A的onPause,然后调用B的onResume

旧的Activity的onPause先调用,然后新的Activity才启动(oncreate,onstart,onresume)

onPause和onStop都不能做耗时的操作,尤其是onPause,这也意味着,我们应当尽量的在onStop中做操作,从而使新的Activity尽快显示出来并且换到前后台

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

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

è¿éåå¾çæè¿°

当系统配置发生改变的时候,Activity会被销毁,其onPause,onStop,onDestroy均会被调用,同时由于Activity是异常情况下终止的,系统会调用onSaveInstanceState来保存当前Activity的状态

这个方法调用的时机是在onStop之前,他和onPause没有既定的时序关系,他即可能在onPause之前调用,也有可能在之后调用

需要强调的是,onSaveInstanceState方法只出现在Activity被异常终止的情况下,正常情况下是不会走这个方法

当我们onSaveInstanceState保存到Bundler对象作为参数传递给onRestoreInstanceState和onCreate方法,因此我们可以通过onRestoreInstanceState和onCreate方法来判断Activity是否被重建。如果被重建了,我们就取出之前的数据恢复

从时序上来说,onRestoreInstanceState的调用时机应该在onStart之后

首先我们在onSaveInstanceState中保存一个字符串,然后当我们的Activity被销毁并且重新创建之后,我们再去获取之前存储的字符串,接收的位置可以选择onRestoreInstanceState或者onCreate,两者的区别是:onRestoreInstanceState一旦被调用,其参数Bundler savedInstanceState一定有值,我们不用额外的判断是否为空但是onCreate不行,onCreate如果正常启动的话,其参数Bundler onSaveInstanceState为null,所以需要一些额外的判断,这两个方法我们选择任意一个都是可以进行数据恢复的,但是关键建议我们使用onRestoreInstanceState去恢复数据

系统只在Activity异常终止的情况下才会调用onSaveInstanceState和onRestoreInstanceState来存储和恢复数据,其他情况不会触发

情况2:资源内存不足导致低优先级的Activity被杀死

Activity按照优先级的从高往低,可以分为三种:

  • 1.前台Activity:正在和用户交互的Activity,优先级最高
  • 2.可见但非前台Activity:比如对话框,导致Activity可见但是位于后台无法和用户直接交互
  • 3.后台Activity:已经被暂停的Activity,比如执行了onStop,优先级最低

当系统内存不足的时候,系统就会按照上述优先级去杀死目标Activity所在的进程,并且在后续通过onSaveInstanceState和onRestoreInstanceState来存储和恢复数据,

系统配置中有很多内容,如果当某项内容发生改变后,我们不想系统重新创建,就可以给configChangs属性加上orientation这个值

android:configChanges="orientation"

我们常用的只有locale,orientation,keyboardHidden这三个选项,其他用的还是比较少的

Activity的启动模式

Activity的LaunchMode

  • standard:标准模式,这也是系统的默认模式,每次启动一个Activity都会重新创建一个实例
  • singleTop:栈顶复用模式,在这个模式下,如果新的Activity已经位于任务栈的栈顶,那么此Activity不会被重新创建,同时他的onNewIntent方法会被调用,通过此方法的参数我们可以取出当前请求的信息
  • singTask:栈内复用模式,这是一种单实例模式,在这种模式下,只要Activity在一个栈内存在,那么多次启动此Activity都不会创建实例
  • singleInstance:单实例模式 ,具有此模式下的Activity只能单独的处于一个任务栈中

Activity 的 Flags

  • FLAG_ ACTIVITY_ NEW _ TASK 是为Activity指向‘singleTask’启动模式,其效果和XML中指定该模式相同
  • FLAG_ ACTIVITY_ SINGLE _ TOP:是为Activity指向‘singleTop’启动模式,其效果和XML中指定该模式相同
  • FLAG_ ACTIVITY_ CLEAR _ TOP : 具有此标记位的Activity,当他启动时,在同一个任务栈中所有位于他上面的Activity都要出栈,这个模式一般需要和FLAG_ ACTIVITY_ NEW _ TASK配合使用,在这种情况下,被启动的Activity的实例如果已经存在,那么系统就会调用它的onNewIntent,如果被启动的Activity采用标准模式,那么他连同他之上的Activity都要出栈,系统会创建新的Activity实例并放入栈顶
  • FLAG_ ACTIVITY_ EXCLUDE_ FROM _ RECENTS : 具有此标记位的Activity,不会出现在历史Activity的列表当中,当某种情况下我们不希望用户通过历史列表回到我们的Activity的时候就使用这个标记位了,他等同于在XML中指定Activity的属性:android:excludeFromRecents="true"

intentFilter的匹配规则


启动Activity分为两种,显示调用和隐式调用,显示调用需要明确的指定被启动对象的组件信息,
包括包名和类名,而隐式意图则不需要明确指定调用信息,隐式调用需要intent能够匹配目标组件的
IntentFilter中所设置的过滤信息,如果不匹配将无法启动目标Activity,IntentFilter中的过滤信息有
action,category,data

​

  • 1.action的匹配规则
action是一个字符串;
intent中的action必须和过滤的action有一样的,才算匹配成功;
一个过滤规则中的可以有多个action;
action区分大小写
  • 2.category的匹配规则
category是一个字符串;系统预定义了一些category
Intent如果出现了category,不管有几个category,对于每个category来说,它必须是过滤规则中已经定义的category;
Intent中可以没有category,如果没有category的话,这个Intent仍然可以匹配成功;

为什么不设置category也可以匹配呢?原因是系统在调用startActivity或者startActivityForResult的时候会默认为Intent加上“android.intent.category.DEFAULT”这个category,所以这个category就可以匹配前面的过滤规则中的第三个category。同时,为了我们的activity能够接收隐式调用,就必须在intent-filter中指定“android intent categor.DEFAULT”这个category

  • 3.data匹配规则
<data
       android:host="string"
       android:mimeType="string"
       android:path="string"
       android:pathPattern="string"
       android:pathPrefix="string"
       android:port="string"
       android:scheme="sstring" />

data由两部分组成,mimeType和URI,前者是媒体类型,比如image/jpeg等,可以表示图片等,而URI包含的数据可就多了,下面的URI的结构:

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

例子:

content://com.liuguilin.project:200/folder/subfolder/etc
http://www.baidu.com:80/search/info

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值