Activity进阶笔记

正常生命周期的方法

  1. onCreate:此方法在Activity创建的时候回调
  2. onRestart:此方法在Activity不可见之后,重新变为可见的过程中时候会回调
  3. onStart:此方法在Activity可见的时候回调,但是此时Activity处在后台,也就是说用户无法进行操作
  4. onResume:同样是可见的时候回调,而此时已经是在前台了,用户可以正常操作界面了
  5. onPause:从前台变为后台的时候,会被调用,比如用户启动了一个透明的Activity,那么之前的Activity就会调用onPause,进入后台。
  6. onStop:Activity不可见的时候会被调用,比如按下Home键,回到桌面,则会调用onPause和onStop
  7. onDestory:Activity被正常销毁的时候会被调用

在启动另外一个Activity的时候,会先调用onPause方法,然后调用第二个Activity的onCreate , onStart, onResume,然后再调用第一个的onStop方法。

所以,不能在onPause方法中进行耗时的操作,否则会影响第二个Activity的启动。同样,onStop也不应该太耗时,onDestory方法可以用来最终的释放资源。

Activity异常情况下的生命周期

  1. 当资源相关的系统配置发生改变Activity被杀死并重新创建

    比如当屏幕尺寸发送改变的时候(旋转屏幕),Activity其实是被销毁了,并重新创建了一个Activity。

    所以先会执行普通的销毁过程onPause->onStop->onDestory,但是在其中会有一步onSaveInstanceState,在onPause之后,用来保存view的状态。

    然后重新启动的时候,会在onRestoreInstanceState里面恢复view之前的状态,此方法调用在onStart之后。

    思考:不是异常情况下,onSaveInstanceState方法也会被调用,但是不会调用onRestoreInstanceState方法。

  2. 如何防止重新创建Activity?

    android:configChanges="orientation|screenSize"在AndroidManifest中,为Activity配置此属性即可防止在翻转屏幕的重新创建Activity。

    取而代之的是会回调onConfigurationChanged方法

  3. 内存不足的时候,系统很可能会杀死在后台的Activity,生命过程与上面一样。

    思考:系统杀死的时候似乎直接结束的进程,而不会走一遍销毁的生命周期。

Activity启动模式

四种启动模式:

设置启动模式:在AndroidManifest中为Activity设置launchMode=""即可。

  1. standard

    这是默认的启动模式,被启动的Activity B如果是standard模式,那么B的新的实例会被创建并加入到启动它的任务栈的栈顶。(Service是没有任务栈的,所以通过Service启动的时候,会报错,要添加FLAG_ACTIVITY_NEW_TASK flag才能启动,这相当于是singleTask模式启动)

  2. singleTop

    与上面的类似,只不过如果B在栈顶,那么不会再创建新的实例。方法的调用:onPause->onNewIntent->onResume。如果B不在栈顶,则会创建新的实例。

  3. singleTask

    这是栈内复用模式。启动Activity的时候,会先查询是否已经存在了任务栈,如果不存在,那么会先创建任务栈,然后再创建实例压栈。如果已经存在,那么会直接在目标栈内寻找实例。如果存在实例,那么会将目标调到栈顶(其之上的会弹栈,也就是有clearTop的效果),如果不存在实例,那么会创建新实例并压栈。

  4. singleInstance

    这个是单实例模式。此模式的Activity只能单独位于一个任务栈中。所以,一旦创建,以后就不会创建新的Activity了,除非该Activity被销毁。

通过上面几种模式的总结,可以思考一个问题:APP的MainActivity适合哪种模式?

适合singleTask模式,因为我们在其他界面回到MainActivity,也就是主界面,那么其他的界面都应该被销毁,而不是按back键能够返回去。所以singleTask可以帮助我们clearTop。

如何指定任务栈?

​ 在AndroidManifest中,为Activity设置android:taskAffinity=""即可,里面填写的值不要与app包名一样,否则是同一个任务栈。默认的任务栈名称是包名。

Activity的Flags

​ intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)

  1. FLAG_ACTIVITY_NEW_TASK
  2. FLAG_ACTIVITY_SINGLE_TOP
  3. FLAG_ACTIVITY_CLEAR_TOP
  4. FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS

隐式启动

IntentFilter匹配规则

intent-filter主要可以配置三个参数,action,category,data.

一个intent只有同时匹配action,category,data才算匹配成功

一个Activity可以配置多个intent-filter,只要匹配上了一个intent-filter就可以启动该Activity。

  1. action

    intent必须要指定一个action,不然会直接匹配失败。

    只要匹配成功一个action即可。

  2. category

    一定要有一个值为<category android:name="android.intent.category.DEFAULT"></category>的category,不然intent会匹配失败。在startActivity的时候,系统会自动给intent加上android.intent.category.DEFAULT,所以在AndroidManifest文件中,必须要加才行,不然没法匹配。

    如果你的intent设置了多个category,那么设置的必须要全部能够被匹配上才行!!!

  3. data

                    <data android:scheme="http"
                        android:host="www.baidu.com"
                        android:port="80"
                        android:path="/search/info"
                        android:mimeType="text/plain"
                        ></data>
    

    data分为两部分,URI和mineType:URI是路径,而mineType是类型

    可以不指定URI,系统会默认指定为content和file,也就是说,在intent中,必须指定Data为content或file才行。

    intent.setDataAndType(Uri.parse("file://abc"),"image/png");

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

推荐阅读更多精彩内容