前言
从最基础的查起,搞清楚里面的原理,把模模糊糊的东西变成清晰,这就是最重要的。刚好本人下周会有一个面试,希望通过这几天的查缺,也能够重新复习一下技术。
Activity篇
1. Activity的生命周期(所用的方法的作用)
首先看下图官方源码的Activity类中的注释:

这个是官方给出来解释,上面的顺序就是给出的周期顺序,我们可以整理一下:

- onCreate() 这是 ActivityManagerService 启动Activtiy后进入的第一个方法,一般会进行初始化界面和数据;
- 接下来是onStart(),,此时Activity进入onStart()方法,当前activity是用户可见状态,但没有焦点,与用户不能交互,一般可在当前方法做一些动画的初始化操作。
- onStart()成之后,此时Activity进入onResume()方法中,当前activity状态属于运行状态 (Running),可与用户进行交互。
上面三个就是界面第一次打开,所要经过的三个方法,如果点击电源键,熄灭显示屏的话,会开始后半段的周期。
- 熄灭屏幕,首先调用的方法是onPause(),当前Activity是可见的,但不能与用户交互状态。我们可以在这里做一些保存数据的操作,Activity类源码注释里也给出了一个日历操作的例子。
- onPause()之后,此时activity进入onStop()方法,此时activity对用户是不可见的,在系统内存紧张的情况下,有可能会被系统进行回收。
- onRestart()方法是重新回到前台才会调用的,这个里面一般不会做什么操作,但是如果应用有对锁屏应用有什么操作,可以在这面做点事情。
- onDestroy()这个是销毁方法,所以一般在当前方法可做资源回收,和资源对象释放等
2. onStart()和onResume()/onPause()和onStop()的区别?
- onStart()是activity界面被显示出来的时候执行的,用户可见,包括有一个activity在他上面,但没有将它完全覆盖,用户可以看到部分activity但不能与它交互,onResume()是当该activity与用户能进行交互时被执行,用户可以获得activity的焦点,能够与用户交互。
- onPause()是界面暂停,但是洁敏可以看到,只是不能交互,onStop()是界面不在可见才调用的
3. Activity A启动另一个Activity B会回调哪些方法?如果Activity B是完全透明呢?如果启动的是一个对话框Activity呢?
看测试图

A打开B会调用,A的onPause()-> B的 onCreate() -> B的onStart()-> B的onResume()->A的onStop()(如果B透明,则这一步不会调用)
4. 优先级低的Activity在内存不足被回收后怎样做可以恢复到销毁前状态
优先级低的Activity在内存不足被回收后重新打开会引发Activity重建。Activity被重新创建时会调用onRestoreInstanceState(该方法在onStart之后),并将onSavaInstanceState保存的Bundle对象作为参数传到onRestoreInstanceState与onCreate方法。因此可通过onRestoreInstanceState(Bundle savedInstanceState)和onCreate((Bundle savedInstanceState)来判断Activity是否被重建,并取出数据进行恢复。但需要注意的是,在onCreate取出数据时一定要先判断savedInstanceState是否为空。另外,谷歌更推荐使用onRestoreInstanceState进行数据恢复。 参考 厘米姑娘
5. Activity的四大启动模式
四大启动模式是standard、singleTop.、singleTask.、singleInstance;
standard 顾名思义,标准的启动模式,就是这种启动模式下,打开一个就启动一个新的,无论栈内是否存在相同的Activity实例;
sinceTop, 栈顶单实例,可以理解成,如果再打开新的Activity实例时候,会首先检查栈顶的activity是否是正要打开的activity,如果是,则会复用栈顶,如果不存在,就会新建一个新的,举例,如果栈里存在A、B,再打开A的时候,会打开新的,但是如果再打开B,就会直接复用。这个启动模式,一般的用途,可以在防止误触打开多个activity或者在网络请求的时候,怕重复打开的需求下,可以使用这个启动模式。.
sinceTask,栈内单实例,就是在同一个栈内存在相同实例时候,就会进行复用,限制条件是同栈。例如有个栈,A-B-C,这个时候无论是新打开ABC中的哪一个,都会复用。另外,这个复用还会有一个后续操作,需要注意,他在复用的同时,会清空两个之间的所有实例。例如 存在A-B-C-D栈,再打开B,那么CD被销毁,B会被推到栈顶,A还是继续存在。这个启动模式的用途,比如,app在进入多个层级后,要返回首页,可以用使用这个启动模式。
sinceInstance,单实例模式,这个只要在app进程内的所有栈里都存在相同实例,就会被复用,没有限制条件。
Fragment
1 Fragment的生命周期
一个fragment的启动,顺序如下图:


1 首先是onAttach(),当Fragment和Activity建立关联时调用,这里面官方给出的例子是,在里面绑定一个activity的回调接口,用来与activityJ进行交互;
2 onCreate(),fragment实例正式创建,但是还未创建界面,与acitivity 的onCreate()是有区别的,它的绑定视图界面是放在onCreateView()去完成的,所以onCreate()不要进行视图操作;
3 onCreateView(),绑定试图,并进行创建,在这里面一般进行控件的绑定和初始化;
4 onCreateActivity(),父Activity被创建完成(即actitiy的onCreate()被调用后)后调用,这里面
5 onStart() 与onStop()类似与activity的
另外这里补充一下,在日常使用fragment过程中,fragment的隐藏切换时候的周期,因为主流app需要相互切换碎片,并且不初始化,我们监听界面的onPause是无效的,因为fragment即使隐藏不可见,也不会调用这个方法,我们可以监听onHiddenChanged(Booean),它会被界面的隐藏和显示触发。
下一章会补缺Sevice、数据存储一技IPC机制的知识,如有错误,欢迎指出改正。
网友评论