Activity详解(一)

Activity是Android组件中最基本也是最为常见用的四大组件(Activity,Service,Content Provider,BroadcastReceiver)之一;
本篇主要从以下几点来详解Activity
*Activity的生命周期
*Activity的启动模式

一、Activity的生命周期

0_1314838777He6C.png

可以看到Activity有7个最基本的生命周期方法
1.onCreate:Activity即将被创建;

2.onStart:表示Activity正在被启动,已经可见了,但是还没有显示到前台;

3.onRestart:Activity正在重新启动,当Activity从不可见到可见时会调用此方法;

4.onResume:Activity可见,并且已经显示到前台可以和用户交互了;(onStart的时候Activity还在后台,在onResume后Activity才显示到前台)

5.onPause:Activity正在停止(可见但不在前台);

6.onStop:Activity即将停止(不可见亦不在前台);

7.onDestroy:Activity即将销毁;

接下来我们从几个实例中来具体了解一下Activity的生命周期;

首先:我们正常启动一个Activity


Paste_Image.png

然后我们回到桌面:


Paste_Image.png

我们再次打开这个Activity
Paste_Image.png

在这个Activity上再启动一个Dialog形式的Activity,第一个Activity任然可见,但是已经转入后台


Paste_Image.png

然后我们退出Dialog返回第一个Activity
Paste_Image.png

从第一个Activity跳转到另一个Activity(非Dialog形式)
Paste_Image.png

再推出第二个Activity返回第一个
Paste_Image.png

最后我们退出第一个Activity
Paste_Image.png

这里有几点需要注意:
1、onCreate和onDestroy、onStart和onStop、onResume和onPause是配对的,其中
onPause和onResume与onStart和onStop的区别在于前者是以是否在前台显示来判断的后者是以是否可以见来区分的;

2、从一个Activity启动另一个Activity,第一个Activity会首先onPause,紧接着第二个Activity开始onCreate、onStart、onResume后,第一个Activity执行onStop;一定要注意跳转时候Activity的生命周期方法执行顺序;

特别说明:如果在一个Activity上启动了一个Dialog(非Activity形式),这时候Activity虽然可见,但是不在前台,Activity是不会执行onPause方法的;

下面我们来研究一下异常情况下Activity的生命周期,所谓异常情况就是资源相关的系统配置发生改变导致Activity被杀死并重建或者资源内存不足导致优先级低的Activity被系统回收等等;最常见的就是横竖屏切换,Activity状态会发生那些改变呢;

首先我们正常启动一个Activity:


Paste_Image.png

正常的走了生命周期的方法;

然后我们从竖屏切换到横屏:


Paste_Image.png

这里我们可以看到,Activity销毁了并重新创建,Activity在销毁之前调用了onSaveInstanceState,并且在Activity重新创建成功后调用了onRestoreInstanceState方法;
onSaveInstanceState:Activity异常销毁保存Activity数据和状态;
onRestoreInstanceState:Activity异常销毁重新创建后恢复数据;
注意:以上方法只会在Activity异常销毁的时候调用,正常情况下是不会调用的;

另外还有一种特殊情况,我们在某些状态改变导致Activity销毁重建如果不希望Activity重新创建,例如横竖屏切换不希望Activity重新创建需要在清单文件中Activity中配置 android:configChanges="orientation" (需要minSdkVersion和targetSdkVersion的值都小于13否则需要配置android:configChanges="orientation|screenSize")
我们来看一下效果,添加以上配置后,我们将Activity从竖屏切换到横屏


Paste_Image.png

可以看到Activity并没有重建,而是调用了onConfigurationChanged方法;

通过上面的分析,我们已经了解了Activity的生命周期,以及Activity在特殊情况下的生命周期;掌握了Activity的生命周期,就可以在不同的方法中做相应的处理,对以后的开发很有帮助;

二、Activity的启动模式

①standard:标准模式,系统默认模式,最常用;

②singleTop:栈顶复用模式,如果Activity位于任务栈内栈顶位置Activity不会重新创建;

③singleTask:栈内复用模式,只要Activity在栈内存在,多次启动Activity就不会重新创建;

④singleInstance:单实例模式;这种模式下,Activity只能单纯的存在一个任务栈中;

注意:任务栈是一种“后进先出”栈结构,每一个Activity都必须依赖一个任务栈,这也是为什么我们用ApplicationContext去启动Activity的时候会报错的原因;standard模式下的Activity默认会进入启动它的Activity的任务栈中;非Activity类型的Context(ApplicationContext)并没有所谓的任务栈,所以就出问题了,解决这个问题就需要为待启动的Activity指定 FLAG_ACTIVITY_NEW_TASK 标记位,这样就会在启动的时候为其创建一个新的标记位;

启动模式解读:
1、standard标准模式:每启动一次Activity,都会为这个Activity创建实例;

2、singleTop模式:假如在一个任务栈中有ABC三个Activity(都是singleTop启动模式),如果再次启动C,由于C在栈顶,那么C就不会被重新创建同时它的onNewIntent方法会被回调;如果启动A,由于A不在栈顶,A就会被重新创建;

3、singleTask模式:假如一个任务栈中有ABC三个Activity,(A为singleTask模式),A并不在栈顶,我们重新启动A,A也并不会创建新的,而是直接移到栈顶并调用A的onNewIntent方法;此时栈内的Activity为 A ,因为singleTask模式自带clearTop的效果,会导致所有在A上面的Activity自动出栈;

4、singleInstance模式:这个是加强版的singleTask模式,它具有singleTask的所有特性;并且还加强了一点,这种模式下的Activity只能单独的位于一个任务栈中,加入A为这种启动模式,启动A后,A单独位于一个任务栈中,这个任务栈中只能有一个Activity A;

注意:由于Activity启动必须依赖任务栈,任务栈是可以指定的,可以在清单文件中配置android:taskAffinity=“”熟悉,任务栈的名字为String,如果不指定,进入默认的任务栈,即以包名为名的任务栈;

如何给Activity指定启动模式

第一种方式:直接在AndroidMenifest中指定 android:launchMode

第二种方式:通过Intent中设置标志位来为Activity指定
Intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

两种方式的区别:第二种优先级大于第一种,如果两种方式都用了,以第二种方式执行;第二种方式无法为Activity指定为singleInstance模式;

Activity中的标志位:
1、FLAG_ACTIVITY_NEW_TASE:为Activity指定singleTask启动模式

2、FLAG_ACTIVITY_SINGLE_TOP:singleTop模式

3、FLAG_ACTIVITY_CLEAR_TOP:当这个Activity启动时所用位于它之上的Activity全部出栈;

4、FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS:具有这个标记的Activity,不会出现在历史Activity列表中;某种情况下,我们不希望用户通过历史列表回到我们的Activity时这个标记比较有用;等同于在XML中指定Activity的属性
android:excludeFromRecents="true"

小结:本次的Activity详解一共就这些内容主要点为

1、Activity的生命周期,Activity从启动到销毁,从前台到后台,不同情况下Activity的哪些生命周期方法会被调用;以及Activity在异常销毁后重新创建要调用的方法;

2、Activity的启动模式;不同的场景应用不同的启动模式,各个启动模式间的区别;了解这些对以后的开发很有帮助;

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

推荐阅读更多精彩内容