Activity

生命周期流程图:


Activity生命周期执行过程:

(1)启动Activity:系统会先调用onCreate()方法,然后调用onStart()方法,最后调用onResume(),Activity进入运行状态。界面可显示

(2)当Activty被其他Activity覆盖上(例如Activity对话框)或者被锁屏:系统会调用onPause()方法,暂停当前Activity的执行。

(3)当Activity由其被覆盖状态回到前台或解锁屏:系统会调用onResume()方法,再次进入运行状态。

(4)当Activity跳转新的页面或者Home回到主屏,自身退到后台:系统会先调用onPause(),然后调用onStop()方法,进入停止状态。

(5)当Activity由重新被启用或者从上个跳回:系统会先调用onRestart()方法,然后调用onStart()方法,最后调用onResume()方法,再次进入运行状态。

(6)当Activity处于被覆盖状态或者后台不可见状态,系统内存不足时,杀死当前Activity,用户返回时:再次调用onCreate()->onStart()->onResume,进入运行状态

(7)当退出当前Activity:系统先调用onPause()方法,然后调用onStop()方法,最后调用onDestory()方法,结束当前Activity。

除了几个常见的方法外,介绍一下onWindowFocusChanged、onSaveInstanceState、onRestoreInstanceState几个常用方法:

(1)onWindowFocusChanged():在Activity窗口获得或者失去焦点的时候被调用,例如首次创建界面显示时,当Activity被其他Activity覆盖,跳转到其他Activity或者Home回到主屏,退出当前Activity。以上情况都会被调用onWindowFocusChanged(),并且当Activity被创建时是在onResume()之后调用,当Activity被覆盖或者退出或者在后台时, 它是在onPause()之后被调用。

(2)onSaveInstanceState():(a)在Activity被覆盖或者退后台之后,系统资源不足将其杀死,此方法会被调用;(b)在用户改变屏幕方向时会被调用;(c)在当前Activity跳转到其他Activity或者Home回主屏,此方法会被调用。

(3)onRestoreInstanceState():(a)在Acitivity被覆盖或者后台时,系统资源不足将其杀死,然后用户又回到了Activity,此方法会被调用;(b)在用户改变屏幕方向时候会被调用。我们可以重写这个方法以便可以恢复一些临时数据。onRestoreInstanceState()调用是在onStart()之后。


Activity四种启动模式

(1)standard 标准模式

standard模式是默认的启动模式,不用配置<activity>android:lauchMode属性即可,当然也可以制定值为standard。不管有没有已存在的实例,都生成新的实例。如下图,每次跳转都会在task中生成一个新的实例,并且放在栈的顶部,回退的时候看到原来的实例。

(2)singTop 栈顶复用模式

配置<activity>指定属性为android:lauchMode="singleTop",系统会按照singleTop启动模式处理跳转行为。如果发现有对应的Activity实例正位于栈顶,则重复利用,不再生成新的实例。如果另一Activity处于栈顶,跳转其时生成新的实例。singleTop模式的原理如下图所示:

(3)singleTask 栈内复用模式

配置<activity>指定属性为android:lauchMode="singleTask",如果发现有对应的Activity实例,则使此Activity实例之上的其他Activity实例统统出栈,使此Activity实例成为栈顶对象,显示到幕前。singleTask模式的原理图如下图所示:

(4)singleInstance 单例模式

配置<activity>指定属性为android:lauchMode="singleInstance"  singleInstance启动模式比较特殊,因为它会启用一个新的栈结构,将Acitvity放置于这个新的栈结构中,并保证不再有其他Activity实例进入。修改FirstActivity的launchMode="standard",SecondActivity的launchMode="singleInstance",我们发现这两个Activity实例分别被放置在不同的栈结构中,关于singleInstance的原理图如下:

如果我们修改FirstActivity的launchMode值为singleTop、singleTask、singleInstance中的任意一个,流程将会如图所示:

singleInstance启动模式可能是最复杂的一种模式,为了帮助大家理解,我举一个例子,假如我们有一个share应用,其中的ShareActivity是入口Activity,也是可供其他应用调用的Activity,我们把这个Activity的启动模式设置为singleInstance,然后在其他应用中调用。我们编辑ShareActivity的配置:

<activity android:name=".ShareActivity" android:launchMode="singleInstance">

            <intent-filter>

                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />

            </intent-filter>

            <intent-filter>

            <action android:name="android.intent.action.SINGLE_INSTANCE_SHARE" />

                <category android:name="android.intent.category.DEFAULT" />

            </intent-filter>

        </activity>

然后我们在其他应用中这样启动该Activity:

Intent intent = new Intent("android.intent.action.SINGLE_INSTANCE_SHARE");

startActivity(intent);

当我们打开ShareActivity后再按后退键回到原来界面时,ShareActivity做为一个独立的个体存在,如果这时我们打开share应用,无需创建新的ShareActivity实例即可看到结果,因为系统会自动查找,存在则直接利用。大家可以在ShareActivity中打印一下taskId,看看效果。关于这个过程,原理图如下:



Activity启动模式的设置

启动模式设置有两种方法:在mainifest中设置、通过Intent设置标志。

(1)<activity

android:launchMode="standard"/>  standard 标准模式  singleTop 栈顶模式 singleTask 栈内复用模式  singleInstance 单例模式。

(2)通过Intent设置标志

Intent inten=new Intent(ActivityA.this,ActivityB.class);  

Intent.addFlags(Intent.FlAG_ACTIVITY_NEW_TASK); 

 startActivity(intent);

标记位属性及含义

FLAG_ACTIVITY_SINGLE_TOP           指定启动模式为栈顶复用模式singleTop;

FLAG_ACTIVITY_NEW_TASK              指定启动模式为栈内复用模式singleTask;

FLAG_ACTIVITY_CLEAT_TOP             所有位于其上层的Activity都要移除,singleTask类似

FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS     具有该标记的Activity不会出现在历史Acitivity的列表中,即无法通过历史列表返回到该Activity上。

两种设置方法的区别:优先级不同  intent>manifest设置方式      限定范围不同     manifest设置方式无法设定FLAG_ACTIVITY_CLEAR_TOP;Intent设置方式无法设置单例模式singleInstance;

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

推荐阅读更多精彩内容