Android面试一天一题(3 Day)

作者: goeasyway | 来源:发表于2016-05-18 21:58 被阅读9111次

    面试题: 怎么理解Activity的生命周期?

    这是一道几乎必问的Android面试题,当听到这题时大家的神经都会麻木,你问我背。说实话,如果你问我怎么理解,我也很难回答,因为这个问题太宽泛了,答什么都可以又答什么都难答好。有一次电话面试问了一个人,对方直接说不要问这种在网上到处都能看到的题,他只要上网一查就会。好吧,我脾气好,就接着问:
    “那问什么题呢?”
    “逻辑的,算法的,业务什么的,就是纯JAVA代码的。”
    “那么熟悉什么算法呢?”
    “。。。”(没答上)

    但Activity的生命周期又至关重要,不问好像又对不起彼此。根据得到的反馈我后来稍稍改变了一下提问方式,不问怎么理解,而是给几个场景问怎么使用回调或回调的顺序(或要注意什么),从侧面看是否真正理解了。

    下面还是先过一下官网上的Activity生命周期图,注意几个框线其实代表又可以细分为不同的周期。


    如果一个Activity在用户可见时才处理某个广播,不可见时注销掉,那么应该在哪两个生命周期的回调方法去注册和注销BroadcastReceiver呢?

    Activity 的可见生命周期发生在 onStart调用与 onStop调用之间。在这段时间,用户可以在屏幕上看到 Activity 并与其交互。我们可以在 onStart中注册一个 BroadcastReceiver以监控影响 UI 的变化,并在用户无法再看到您显示的内容时在 onStop中将其取消注册。

    如果对方回答是在onResume和onPause方法中,那么你可以去引导对方看看在这两个方法有什么不好的地方。

    如果有一些数据在Activity跳转时(或者离开时)要保存到数据库,那么你认为是在onPause好还是在onStop执行这个操作好呢?

    这题的要点和上一题是一样的,onPause较容易被触发,所以我们在做BroadcastReceiver注销时放在onStop要好些。onPause时Activity界面仍然是可见的,如弹出一个Dialog时。但在保存数据时,放在onPause去做可以保证数据存储的有效性,如果放在onStop去做,在某些情况下Activity走完onPause后有可能还没顺利走到onStop就被系统回收了。

    但要注意在onPause中要非常迅速地执行完所需操作,不然会影响到下一个Activity的生命周期函数的调用。

    简单说一下Activity A启动Activity B时,两个Activity生命周期的变化。

    当一个 Activity 启动另一个 Activity 时,它们都会发生生命周期转变。第一个 Activity 暂停然后停止(但如果它在后台仍然可见,则不会停止,比如B是半透明的),系统会创建另一个 Activity。 如果这两个Activity 共用保存数据到文件或者数据库,必须要注意,在创建第二个 Activity 前,第一个 Activity 不会完全停止。更确切地说,启动第二个 Activity 的过程与停止第一个 Activity 的过程存在重叠。

    以下是当 Activity A 启动 Activity B 时一系列操作的发生顺序:

    Activity A 的 onPause方法执行。
    Activity B 的 onCreate、onStart和 onResume方法依次执行。
    然后,如果 Activity A 在屏幕上不再可见,则其 onStop方法执行。

    您可以利用这种可预测的生命周期回调顺序管理从一个 Activity 到另一个 Activity 的信息转变。 例如,如果您必须在第一个 Activity 停止时向数据库写入数据,以便下一个 Activity 能够读取该数据,则应在 onPause而不是 onStop执行期间向数据库写入数据。

    小结

    这几个问题看似简单,其实还是很能问出面试者是否真正理解Activity生命周期的转变。经常有人会问,知道这些有什么用?又不能提升编程能力?编程能力是一个很复杂的体系,不能光看有技术含量或者高大上的算法才叫有能力,和悟道一样,我认为认识理清Android体系,顺应它的道(机制)开发应用也是一种能力。

    相关文章

      网友评论

      • 高级组装搬运工吴哥:感谢楼主的总结,但是我想提出一个意见,就是动态注册广播的时候最好在onResum和onPause中完成,因为onStart可见但不在前台不可交互,onStop在内存不足时不会被调用,在Activity使用透明主题时也不会被调用,所以,如果不能正确的注销广播会引起内存泄露
      • 陈大冲:个人觉得动态注册广播的操作还是放在onResume中比较合适,放在onStart中不太好。
      • dongbingliu:Activity 生命周期
        onCreate()-> onStart () -> onResume() -> onPouse()->onStop()->onDestroy()

        如果一个Activity在用户可见时才处理某个广播,不可见时注销掉,那么应该在哪两个生命周期的回调方法去注册和注销BroadcastReceiver呢?
        onStart(),onPouse()

        如果有一些数据在Activity跳转时(或者离开时)要保存到数据库,那么你认为是在onPause好还是在onStop执行这个操作好呢?
        onPouse(),更容易被触发

        简单说一下Activity A启动Activity B时,两个Activity生命周期的变化?
        A onResume()->onPouse()->onstop()
        B onCreate()-> onStart()->onResume()

        RyanYans32:还有第四点写的啥玩意。。
        RyanYans32:第三个问题没有谁好谁坏,onPouse也会阻塞下一个Activity启动
      • 望北8261:从Activity A跳到Activity B,个人觉得应该是这样
        A-onPause
        B-onCreate-onStart
        A-onStop
        B-onResume
        因为B调用onStart之后就可见了,那么A应该就不可见了,所以此刻A应该会调用onStop

        但事实证明不是这样。。。
        zbiext:@追意狂人 昂.
      • 朋友你的学生卡掉了:我是这样理解的:
        Activity生命周期中的7个方法,四大状态(可见、可见不可操作、不可见、销毁)。
        onCreat() -> onStart() -> [可见不可操作] -> onResume() -> [可操作] -> onPause() -> [可见不可操作] -> onStop() -> [不可见] -> onDestroy() -> [销毁]
      • 203cbf399350:楼主辛苦了,感谢你的分享
      • b09dbea7de6a:其实很好理解,onStart()为可见,onResume()为获取了焦点。还有上面dialog问题,要分这个dialog属于哪一个Activity,如果为本Activity的dialog,就不会失去焦点也就是执行onPause(),如果是其他Activity的dialog就会失去焦点,因为dialog是window type是子window,要依附于type为应用window。还有上面所说的保存数据肯定要在onPause(),因为只有这个方法是一定会执行,在异常情况下,onStop()方法可能不会执行
        minjie0128:@b09dbea7de6a 好像Dialog的type类型是TYPE_APPLICATION 不是子window类型
      • f43bd2ab367b:个人觉得在onpause不合适
      • 2e7e47dfd8de:onstart可见但没到前台不可交互,onresume才可以交互
      • 流浪的猫1712:onPause时Activity界面仍然是可见的,如弹出一个Dialog时。 这是有问题的,弹出dialog是不会调用生命周期方法的。
        1e8ab24ab3cf:调用dialog形式的activity才会触发当前activity的生命周期
        流浪的猫1712:@執O_o念 我是测试过,才回复的,页面弹出dialog,Activity是不会调用任何生命周期方法的,因为dialog就是Activity的一部分。你可以自己试试。
        執O_o念:@流浪的猫1712 乱说,自己去试
      • HuDP:其实这个还是很有用的 赞同最后那段话
      • HuDP:你好,Activity 的可见生命周期发生在 onStart调用与 onStop调用之间。在这段时间,用户可以在屏幕上看到 Activity 并与其交互。 这里的理解是不是有点错误,onStart是可见,但并不可交互的,onResume才可交互的,这也是onStart(可见)和onResume(可见且可交互,在前台了)的区别
        PeterHe888:@goeasyway 不是说看到并与其交互吗?那在onStart()注册一个广播,只是可以监听到非人为主动操作的UI变化吧?
        goeasyway:@HuDP 你说的是对的,我其实也只是说了可见没有说可交互。
        txwgoogol:@HuDP 同意
      • Neulana:楼主你好,可以说一下onStart方法和onResume方法的区别吗?我在网上看了好多文章,发现自己还是不能理解它们之间的区别,为什么要分成两个方法,基本上执行了onStart就必定会执行onResume呀?
        Neulana:懂了,谢谢😁
        Torang:@加速度猫 onStart方法是activity一创建就会执行,onResume方法在onStart方法之后执行。当某个activity没有被销毁而重新获取屏幕焦点的时候会执行onResume方法而不会再执行onStart方法了!比如,当你手机长时间不操作黑屏以后,再次打开的时候由于activity没有被销毁就会执行onResume方法,而不是执行onStart方法!(即在activity生命周期中,onstart只执行一次,而onresume方法可能会执行多次),明白了吗?
        李文文丶:@加速度猫 我的理解是:onstart是用户可见,但是不能交互,onresume是用户可见可交互。大概这个区别了吧

      本文标题:Android面试一天一题(3 Day)

      本文链接:https://www.haomeiwen.com/subject/lkcwrttx.html