Android回顾--(七) Activity的启动模式和intent的七大属性

Task以及backTask

1、Task:任务-->Android程序里面的理解 一组Activity的对象的集合就称为Task
2、BackTask:一组处于任务栈中的Activity的集合
  对于Android软件而言,Android软件的使用是依赖于Java来进行编程的,我们每次打开一个页面,实际上是这个Android虚拟机帮助我们创建一个Activity的类的对象,然后将咱们创建的这个对象按照一定的规律放入任务栈中。
任务栈:也是栈,按照栈的存储特点:现进后出。
  一个Activity在创建对象放入到任务栈中的时候,首先会获取Activity的Affinity属性,如果当前的Activity拥有自身的Affinity属性的话,那么就按照我们Affinity属性所标记的任务栈,找到该任务栈将我们的Activity对象放到任务栈中,如果我们的Activity没有Affinity这个属性的话,那么就会去找当前Application的Affinity属性。如果Application也没有Affinity属性的话,那么就会将当前工程的包名作为Affinity属性来进行使用。如果Application拥有Affinity属性的话,那么就会将Application的Affinity属性当做任务栈的一个标记。
注意:Affinity属性在配置文件中使用的时候,实际上使用的是taskAffinity这个属性来替代的。

关于任务栈,里面有三个属性需要关注一下

android:allowTaskReparenting="true"  允许对象进行移栈    当我们创建这个对象的时候首先会去栈里面找名字和当前这个Affnity属性相同的栈,然后将当前的对象放到栈里面
android:clearTaskOnLaunch="true"    当我们按下那个Home键的时候会将当前这个对象上面的所有对象全部出栈只是留下当前对象和对象以下的对象
android:taskAffinity="com.foxocnn." 这个表示的是将当前的对象放到指定标记的任务栈中

Activity的启动模式:

   启动模式是在面试中经常问到的,在平时开发中,关于优化也会涉及到启动模式的选择。启动模式是用来描述Activity创建对象的时候,在任务栈里面的存在形式的。
Android有四种启动模式:
1、 android:launchMode="standard" //标准的启动模式,每打开一个Activity就会在当前的任务栈里面创建一个对象,如果同一个页面打开多次的话,就会出现体验上满的问题。
2、 android:launchMode="singleTop" //在打开页面之前都会检查在当前任务栈的栈顶是否存在当前页面的对象 如果已经有这个对象了,就不会重复创建 ,直接拿出来使用。
3、android:launchMode="singleTask" //在打开Activity之前首先会检测当前的栈里面是否存在该类的对象,如果存在,那么就将当前这个存在的对象的上面的所有的对象全部出栈,显示当前对象。
4、android:launchMode="singleInstance" //如果一个Activity的属性使用了singleInstance的话,那么在创建这个类的对象的时候就会去任务栈里面找具有相同的打开模式并且存在相同Affinity属性的话,那么就减这个对象当知道该任务栈中。如果上面的两个条件有一个不满足的话,那么都会重新的打开一个任务栈来存储Activity的对象。
常见的就是浏览器的应用、当我们一个应用打开浏览器之后如果浏览器没有关闭的话 此时如果另外一个浏览器也需要打开这个浏览器的话就会重用刚刚打开的对象。

singleInstance容易出现的两个坑:

1、定义三个Activity,分别为A Activity、B Activity、C Activity,除了B Activity的启动模式为singleInstance,其他都是默认的standard。应用通过startActivity开启了一个A Activity,在A Activity里面startActivity了一个B Activity,在B Activity里面startActivity了一个C Activity。正常情况下,当前的任务栈中的顺序应该是:A Activity-->B Activity-->C Activity。那么在当前C Activity页面按返回键,finish当前页面之后应该回到了B Activity的界面。但是,生活总是不会让你如意的。页面直接回到了A Activity。是不是感到很纳闷?其实这才是正常的情况,singleInstance模式是存在于另一个任务栈中的,也就是说A Activity和C Activity是处于同一个任务栈中,B Activity则是存在另一个栈中。所以当关闭C Activity的时候,他自然就会去找当前任务栈中存在的Activity。当前的任务栈里面的所有Activity都关闭之后,才会去找另一个任务栈中的Activity,也即是说只有当A Activity也被finish之后才会回到B Activity界面。如果还想回到B Activity页面怎么办?在B Activity里面定义一个全部变量,public static boolean returnActivityB; 界面需要跳转的时候将returnActivityB=true;然后在A Activity界面onStart方法里面判断returnActivityB是都为true,是的话就跳转B Activity,同时将returnActivityB=fasle;这样就能解决跳转的问题。
2、定义两个Activity,A Activity和B Activity,A Activity的启动模式为默认的,B Activity的启动模式为singleInstance。挡在A Activity通过startActivity启动了B Activity。按下home键,应用退到后台。此时再点击图标进入APP,正常情况因该是回到的B Activity,但是,还是那句话,生活总是不会让你如意的。当前界面显示的是A Activity。这是因为当重新启动的时候,系统会先去找Launcher这个任务栈里面去寻找Activity,也查看是否有存在的Activity。没有的话则会重新启动Launcher。解决方法和前面的一样。

Intent的七大属性

Intent的七大属性.png

1、ComponentName(组件名称)


Componentname.png

2、Action(动作)


Action.png

3、Category(类别)
Category.png

4、Data(数据),Type(MIME类型)
Data.png

5、Extras(额外)


Extras.png

6、Flags(标记)
Flags.png

Intent里面包含有一个Flags

 Intent.addFlags()     .....一般用在打开一个Activity的时候  表示的是Actiivy打开之后以怎样的形式放到这个任务栈中

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

推荐阅读更多精彩内容