重学Android—Activity(一)

前言

一直以来就有想法,想把自己学过的知识通过写文章的方式记录下来,一来有什么错误可能还可以借助大家的力量帮忙指出,二来也可以成为自己复习的一个参考。可是,由于工作任务繁重,就只是当时把知识做了笔记,现在回头找笔记才发现自己很多知识都没那么熟练了,所以想开一个重学Android专题,复习一下学过的知识,本文就是重学Android的开篇,整理一下Activity的相关知识。

概述

本篇文章将会从以下几个方面来对Activity进行一个复习,为了不浪费大家的时间,简单列一下本篇文章的知识点,不感兴趣的可以略过。

  • Activity启动模式分析
  • IntentFilter匹配规则
  • Acitivity 日常使用需要注意的点

接下来我们就对以上知识点一一进行复习。

  • Activity启动模式分析

我们对Activity的启动模式应该都很熟悉了,目前启动模式共有四种:standard(标准模式,也是默认模式),singleTop(栈顶复用模式),singleTask(栈内复用模式)和singleInstance(单实例模式)。

standard

标准模式,在这种模式下,每次启动Activity都会创建一个新的实例,此时,哪个Activity启动了这个Activity,这个Activity就会运行在启动它Activity所在的任务栈中 比如有两个Activity A和B,B的启动模式是standard,A启动B,B就会运行在A所在的任务栈中,所以,当用非Activity类型Context启动时,需要为其指定FLAG_ACTIVITY_NEW_TASK 这个标志位,因为非Activity类型Context是没有所谓任务栈的。

singletop

栈顶复用模式,在这种模式下,如果要启动的Activity已经位于栈顶,则不会创建新的实例,同时会回调它的onNewIntent方法,onCreate和onStart方法都不会回调,如果要启动的Activity不在栈顶,那么此时就相当于standard模式。

singleTask

栈内复用模式,只要要启动的Activity的实例存在,就不会再创建新的实例了,和singleTop一样,会回调它的onNewIntent方法,onCreate和onStart方法都不会回调。如果它的实例不存在,则首先会确认它所需任务栈是否存在,不存在则先创建任务栈,然后把它压入栈中,存在则直接入栈,需要注意的是,singleTask默认具有clearTop的功能,而且这种模式下,要启动的Acitivity是运行在自己所需要的任务栈中。

singleInstance

单实例模式,它总是单独的运行在它自己的任务栈中,只要启动它,系统便会为它创建一个任务栈并把它压入栈中,以后每次启动它均不会创建新的实例。

启动模式应用场景

singleTop:现在很多App都有推送功能,那么点击推送消息打开的Activity用singleTop模式就比较合适,这样当多条推送消息来的时候,点击不同的消息,不需要每次都创建新实例。也就是说,假如一个Activity很可能被多次启动,这时候就可以考虑用singleTop模式。

singleTask:这个模式具有clearTop的功能,所以当我们希望Activity不能保留其之上的Activity的时候,可以考虑singleTask模式,例如App主页面。

singleInstance:单实例模式,当很多App都需要打开这个Activity,我们可以考虑用这个模式,这样就可以避免创建很多实例。

  • IntentFilter匹配规则

tips:一个Intent需要同时匹配过滤规则中的 action,category,data才算匹配成功,否则匹配失败。

action

Intent必须有action且其内容必须和过滤规则中其中一个action内容完全相同。

category

如果Intent中含有category,那么所有的category都要和过滤规则中的一个category完全相同才算匹配成功,否则匹配失败,如果Intent没有category,那么在启动activity时,系统会默认加上"android.intent.category.DEFAULT"这个category,所以如果我们Activity需要隐式启动,需要加上这个默认的category,否则容易匹配失败。同时也要注意下category和action的区别。

data

data匹配规则和action一样。data是由mimeType和URI组成的,URI默认值为content和file。

  • Activity注意事项

  • Activity 间通过隐式 Intent 的跳转,在发出 Intent 之前必须通过resolveActivity(PackageMananger.queryIntentActivities(),PackageMananger.resolveActivity,Intent.resolveActivity())
    检查,避免找不到合适的调用组件,造成 ActivityNotFoundException 的异常。

  • Activity间通过Intent传递数据是有大小限制的,所以不能传递过大的数据。否则容易crash或导致新Activity无法启动。可以借助EventBus,静态类等等方式来传递大数据。

  • Activity#onDestroy()方法有可能执行的晚甚至不会执行,所以有些资源回收工作可以不在这里进行,可以在onpause()或onStop()中结合isFinishing()判断执行。

参考

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

推荐阅读更多精彩内容