Activity那些或许你不太清楚的事

看了标题也许你会想,也许你会说,activity我天天用,我最了解不过了,没有什么是我不清楚的。你怕是在唬我吧?那下面就看看我说的这些你都了解嘛

基础知识

  • 正常情况下的生命周期

    • onCreate:表示Activity正在被创建,我们可以做一些初始化工作,没啥子可说的。

    • onRestart:当当前Activity从不可见重新变为可见状态时,该方法会被调用。

    • onStart:这时Activity已经可见的,但是处于后台,无法和用户交互。

    • onResume:这时Activity已经可见的,但是处于前台。

    • onPause:在这个方法可以做一些存储数据,停止动画的操作,但是不能太耗时,因为这会影响到新Activity的显示,onPause必须执行完,新Activity的onResume才会执行。

    • onStop:Activity即将停止,可以做一些稍微重量级的回收工作,同样不能太耗时。

    • onDestory:表示Activity即将销毁,我们可以做一些回收工作和资源释放工作。

    Activity第一次启动会调用onCreate-->onStart-->onResume,当用户打开新的Activity或者切换到桌面的时候,会调用onPause-->onStop,如果这个Activity采用透明主题,不会调用onStop,是因为新Activity透明主题我们还能看到下面那个之前Activity,所以不会调用onStop,再回到原Activity时调用onRestart-->onStart-->onResume.

  • 异常情况下的生命周期

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

    • 资源不足时导致优先级低的Activity被杀死

    • ...

    Activity会调用onSaveInstanceState方法,系统自动为我们做了一定的恢复工作,并且重启为我们恢复这些数据,比如文本框中用户输入的数据,listView滚动位置等,具体的我们可以查看特定View的源码。

  • Activity的启动模式

    1、使用场景

    • standard:当需要每次请求都新开一个实例的时候,比如,浏览器开多个浏览窗口。

    • singleTop:适合作为接受通知的启动界面,比如,客户端收到10条推送,如果是标准模式,分别点击这10个推送,就会启动10个这样的显示内容的界面,而如果是singleTop,则只会打开一个显示界面。

    • singleTask:适合作为程序的入口,不管其他程序打开该界面多少次,都只会在任务栈中存在一份,比如浏览器的启动界面。

    • singleInstance:适合永远都不会变化的界面,比如闹钟的提醒界面,在比如拨号程序的呼叫界面。

2、它们主要有如下不同:

  • 如何决定所属task
    “standard”和”singleTop”的activity的目标task,和收到的Intent的发送者在同一个task内,除非intent包括参数FLAG_ACTIVITY_NEW_TASK。
    如果提供了FLAG_ACTIVITY_NEW_TASK参数,会启动到别的task里。
    “singleTask”和”singleInstance”总是把activity作为一个task的根元素,他们不会被启动到一个其他task里。
  • 是否允许多个实例
    “standard”和”singleTop”可以被实例化多次,并且存在于不同的task中,且一个task可以包括一个activity的多个实例;
    “singleTask”和”singleInstance”则限制只生成一个实例,并且是task的根元素。 singleTop要求如果创建intent的时候栈顶已经有要创建 的Activity的实例,则将intent发送给该实例,而不发送给新的实例。
  • 是否允许其它activity存在于本task内
    “singleInstance”独占一个task,其它activity不能存在那个task里;如果它启动了一个新的activity,不管新的activity的launch mode 如何,新的activity都将会到别的task里运行(如同加了FLAG_ACTIVITY_NEW_TASK参数)。
    而另外三种模式,则可以和其它activity共存。
  • 是否每次都生成新实例
    “standard”对于没一个启动Intent都会生成一个activity的新实例;
    “singleTop”的activity如果在task的栈顶的话,则不生成新的该activity的实例,直接使用栈顶的实例,否则,生成该activity的实例。
    比如现在task栈元素为A-B-C-D(D在栈顶),这时候给D发一个启动intent,如果D是 “standard”的,则生成D的一个新实例,栈变为A-B-C-D-D。
    如果D是singleTop的话,则不会生产D的新实例,栈状态仍为A-B-C-D
    如果这时候给B发Intent的话,不管B的launchmode是”standard” 还是 “singleTop” ,都会生成B的新实例,栈状态变为A-B-C-D-B。
    “singleInstance”是其所在栈的唯一activity,它会每次都被重用。
    “singleTask”如果在栈顶,则接受intent,否则,该intent会被丢弃,但是该task仍会回到前台。
    当已经存在的activity实例处理新的intent时候,会调用onNewIntent()方法 如果收到intent生成一个activity实例,那么用户可以通过back键回到上一个状态;如果是已经存在的一个activity来处理这个intent的话,用户不能通过按back键返回到这之前的状态。
2、IntentFilter的匹配规则
- action的匹配规则:要求Intent中的action存在且必须和过滤规则中的其中一个action相同,这个区分大小写,如果相同的字符串,大小写字母不同,action会匹配失败。

- category匹配规则:这个可有可无,如果有,则必须和过滤规则中的其中一个category相同,如果不写的话,在启动Activity时系统会自动加上"android.intent.category.DEFAULT"

- data可进一步分为uri(由scheme、host、port、path | pathPattern | pathPrefix这4部分组成)和mimetype。Intent的uri可通过setData方法设置,mimetype可通过setType方法设置。隐式Intent也必须指定data。同action类似,只要Intent的data只要与Intent Filter中的任一个data声明完全相同,data方面就匹配成功。需要注意的是:若Intent Filter的data声明部分未指定uri,则缺省uri为content或file,Intent中的uri的scheme部分需为content或file才能匹配;若要为Intent指定完整的data,必须用setDataAndType方法,原因请看setData和setType方法的源码:
public Intent setData(Uri data) {
    mData = data;
    mType = null;
    return this;
}

public Intent setType(String type) {
    mData = null;
    mType = type;
    return this;
}

从以上代码可以看到,setData会把mimeType置为null,setType会把uri置为null。下面我们来举例说明一下data的匹配。首先我们先来看一下Intent Filter中指定data的语法:

<data android:scheme="...“ 
      android:host="..."
      android:port="..."
      android:path="..."
      android:pathPattern="..."
      android:pathPrefix="..."
      android:mimeType="..." />

其中scheme、host等各个部分无需全部指定。假如我们为MyActivity的Intent Filter指定了如下data:

<intent-filter>
    <data android:mimeType="vidoe/mpeg" android:scheme="http" android:host="www.xxx.com" />
    <data android:mimeType="text/plain" android:scheme="http" />
</intent-filter>

那么我们的Intent想要匹配,mimeType可以为”text/plain"或“video/mpeg",scheme必须为”http“,host则没有限制,因为第二个data没有指定host。

最后

这就是我知道的关于activity的一些知识,若有叙述不清晰或是不准确的地方希望大家指出,如果你知道更多知识,欢迎给我评论,大家一起学习进步。谢谢观看

参考资料 《Android开发艺术探索》

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

推荐阅读更多精彩内容

  • 1.什么是Activity?问的不太多,说点有深度的 四大组件之一,一般的,一个用户交互界面对应一个activit...
    JoonyLee阅读 5,729评论 2 51
  • ¥开启¥ 【iAPP实现进入界面执行逐一显】 〖2017-08-25 15:22:14〗 《//首先开一个线程,因...
    小菜c阅读 6,375评论 0 17
  • Activity 一、四种形态 运行状态: 当 Activity 处于栈的顶层,可见,并可与用户进行交互 onRe...
    任教主来也阅读 1,640评论 1 10
  • 【 Android四大组件之一 主要用于与用户进行交互,在一个App中可能存在零个或多个Activity 】 1....
    征程_Journey阅读 1,941评论 0 4
  • 客中初夏 司马光---宋代 四月清和雨乍晴,南山当户转分明。 更无柳絮因风起,惟有葵花向日倾。 译文: 初夏四月,...
    阿喵爱读书阅读 347评论 1 3