1.1 activity的生命周期全解析

1. 生命周期(共7个)

  • 1.onCreate:表示activity的创建,我们可以做初始化数据工作。
  • 2.onStart:表示activity的可见,但我们还看不到。
  • 3.onResume:表示activity出现在前台,我们可以看到。
  • 4.onPause:表示activity正在停止工作,紧接着会执行onStop。这里不可以执行耗时操作。因为当前activity的onPause执行完,下一个activity的onResume才会执行。
  • 5.onStop:表示activity的停止工作。可以执行一些耗时操作。
  • 6.onDestory:表示activity的销毁,我们可以做一些资源回收和释放工作。
  • 7.onRestart:表示activity正在重新启动。出现的时机是activity的onPause和onStop执行了,接着用户又回到这个activity时。

2. 针对一个特定的Activity

  • 第一次启动:onCreate->onStart->onResume
  • 再次回到原Activity:onRestart->onStart->onResume
  • 用户按back键:onPaume->onStop->onDestroy

3. 特殊情况,当下一个activity采用了透明主题

那么当前Activity不会回调onStop。也就是依旧可见,但不在前台。因为下一个透明,可能还会看到当前的activity。

4. onStart和OnResume,onStop和onPause的不同?

onStart和onStop表示是否可见;onResume和onPause表示是否在前台。而且这两块多是连续操作,实际使用没有明显区别。注意onPause不能耗时,如果下一个Activity是透明主题,则当前Activity的onStop不会执行。

5. 当前activity的onPause和下一个activity的onResume哪个会先执行?

用脚趾头想想,如果下一个Activity的onResume先执行,则会出现两个activity在前台并获得焦点,这是不可能的。所以当前Activity的onPause先执行,所以onPause中不要进行耗时操作。

6. activity的启动过程简述

启动Activity的请求会由instrumentation来处理,然后它通过Binder向AMS(ActivityManagerService)发请求,AMS内部维护着一个ActivityStack并负责栈内Activity的状态同步,AMS通过ActivityThread去同步Activity的状态而完成Activity生命周期方法的调用。

7. 系统资源加载机制简述

比如图片资源,当我们把图片放到drawable中时,我们可以通过Resources去获取。同时为了兼容不同设备,我们可能还需要在其他目录放置不同的图片,比如drawable-hdpi,drawable-xhdpi等。这样,当应用程序启动时,系统就会根据当前设备的情况去加载合适的Resources资源,同理横竖屏也可能会加载不同图片(drawable-hdpi-port和drawable-hdpi-land)。此时如果旋转屏幕,由于系统配置发生了改变,默认情况下,Activity就会被销毁和重建。

8. 默认情况下Activity的销毁和重建生命周期

  • 销毁:onSaveInstanceState->onStop->onDestory
  • 重建:onCreate->onStart->onRestoreInstanceState
    onSaveInstanceState方法和onRestoreInstanceState方法和onPause,onResume方法无时间先后,和onStop,onStart方法是有时间先后的。他们存在的意义是当Activity异常终止时,保存和恢复一些数据。

9. activity和view在异常终止时的默认操作

当Activity被异常终止时,Activity会调用onSaveInstanceState去保存数据,然后Activity会委托window去保存数据,window再委托顶级容器去保存数据。顶层容器是一个ViewGroup,一般是DecorView(decor-装饰器)。最后顶层容器再去一一通知它的子View来保存数据。View也有onSaveInstanceState和onRestoreInstanceState方法,会保存一些view本身的数据。如textView会保存当前文本以及选中状态;listview会保存滚动位置等。

10. Activity中的onSaveInstanceState和onRestoreInstanceState的正确使用方式

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_test);

    if (savedInstanceState != null) {
        String test = (String) savedInstanceState.get("test");
        Log.e("aaa","onCreate:"+test);
    }
}

@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    String test = "------------";
    Log.e("aaa","onSaveInstanceState:"+test);
    outState.putString("test",test);
}

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
    super.onRestoreInstanceState(savedInstanceState);
    String test = (String) savedInstanceState.get("test");
    Log.e("aaa","onRestoreInstanceState:"+test);
}

打印的Log如下:

06-14 10:45:56.469 21070-21070/qingfengmy.behaviordemo.free E/aaa: onPause
06-14 10:45:56.472 21070-21070/qingfengmy.behaviordemo.free E/aaa: onSaveInstanceState:------------
06-14 10:45:56.472 21070-21070/qingfengmy.behaviordemo.free E/aaa: onStop
06-14 10:45:56.472 21070-21070/qingfengmy.behaviordemo.free E/aaa: onDestroy
06-14 10:45:56.556 21070-21070/qingfengmy.behaviordemo.free E/aaa: onCreate:------------
06-14 10:45:56.557 21070-21070/qingfengmy.behaviordemo.free E/aaa: onStart
06-14 10:45:56.557 21070-21070/qingfengmy.behaviordemo.free E/aaa: onRestoreInstanceState:------------
06-14 10:45:56.557 21070-21070/qingfengmy.behaviordemo.free E/aaa: onResume

恢复数据时,其位置可以在onCreate或onRestoreInstanceState中,二者的区别是:onRestoreInstanceState一旦被调用,其参数saveInstanceState一定是有值的,不用判空。onCreate需要判空。官方建议用onRestoreInstanceState,实际开发中因为onCreate中会做初始化数据,此时再执行onRestoreInstanceState有时会造成重复。在onCreate中做空和不空的处理挺好。

11. Activity的优先级

  • 1.前台Activity---正在和用户交互的Activity,优先级最高。
  • 2.可见但非前台Activity---如Activity弹了一个dialog,dialog获得焦点,Activity可见但非前台。执行了onPause.
  • 3.后台Activity---执行了onStop的Activity
    优先级从1到3,逐渐降低。系统内存不足时会从3到1去杀进程。

12. 旋转屏幕Activity不重建的方法

<activity
    android:name=".TestActivity"
    android:configChanges="orientation|keyboardHidden">
</activity>

configChanges可以有许多值,比如orientation-屏幕方向发生改变;keyboardHidden-屏幕访问性发生改变,如弹出键盘;screenSize-屏幕尺寸发生改变(API13添加的)等。
Activity配置configChanges后,上面配置的信息发生改变时,Activity不会重建,会执行onConfigurationChanged方法。

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

推荐阅读更多精彩内容

  • 启动与销毁Activity 不同于使用 main() 方法启动应用的其他编程范例,Android 系统会通过调用对...
    安卓Boy阅读 1,706评论 3 5
  • 您的应用中的Activity应该做到如下需求: 1.用户在使用应用时接听来电或切换到另一个应用,它不会崩溃。 2....
    正阳Android阅读 493评论 1 0
  • 移动应用客户端与服务器之间的通信协议,目前比较主流的有Facebook的Thrift,腾讯的JCE,以及Googl...
    stefanli阅读 6,661评论 0 14
  • 时间用途: 1.学习工作技巧 2.见客户,增员(主顾开拓算在里面) 3.读书 其他的事情都视为浪费时间
    二强笔谈阅读 178评论 0 1
  • 顾城的《避免》里有这样一句话:你不愿意种花,你说,我不愿意看见它,一点点凋落,是的,为了避免结束,你避免了一切...
    YZY_1989阅读 685评论 0 1