Activity是在面试过程中经常会被问到的四大组件之一,比如它的生命周期、启动模式等等,在这里将详细展开来讲解,不只是为了应付面试,在平时的开发过程中,掌握这些知识也是很重要的。
Q:Activity的生命周期?
A:相信很多人都在网上看过这么一张图片:
很多面试官会问你Activity的生命周期有哪些?
这个问题就很好回答了,照着这个图片依次说出来就好了。
Q:当dialog弹出来的时候,Activity执行了哪些生命周期的方法,当dialog消息的时候,又执行了哪些方法?
A:如果是单纯是创建的dialog,Activity并不会执行生命周期的方法,但是如果是跳转到一个不是全屏的Activity的话,当然就是按照正常的生命周期来执行了,即onPasue()->onStop()。
Q:设备横竖屏切换的时候,Activity的生命周期是如何变化的?
A:不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次;
设置Activity的android:configChanges="orientation"时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次;
设置Activity的android:configChanges="orientation|keyboardHidden"时,切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法;
tips:还有一点,非常重要,一个Android的变更细节!
当API >12时,需要加入screenSize属性,否则屏幕切换时即使你设置了orientation系统也会重建Activity!
横竖屏切换生命周期的执行
Q:Activity的启动模式有哪些?各有怎样的作用?
A:
Activity一共有四种launchMode:standard、singleTop、singleTask、singleInstance。
1.standard 模式是默认的启动模式,不用为配置android:launchMode属性即可。standard启动模式,不管有没有已存在的实例,都生成新的实例。
2.singleTop 我们在上面的基础上为指定属,android:launchMode="singleTop",系统就会按照singleTop启动模式处理跳转行为。跳转时系统会先在栈结构中寻找是否有一个Activity实例正位于栈顶,如果有则不再生成新的,而是直接使用。如果系统发现存在有Activity实例,但不是位于栈顶,重新生成一个实例。 这就是singleTop启动模式,如果发现有对应的Activity实例正位于栈顶,则重复利用,不再生成新的实例。
3.singleTask 如果发现有对应的Activity实例,则使此Activity实例之上的其他Activity实例统统出栈,使此Activity实例成为栈顶对象,显示到幕前。
4.singleInstance 这种启动模式比较特殊,因为它会启用一个新的栈结构,将Acitvity放置于这个新的栈结构中,并保证不再有其他Activity实例进入。
Q:如何快速启动一个Activity?
A:这个问题其实也是比较简单的,就是不要在Activity的onCreate方法中执行过多繁重的操作,并且在onPasue方法中同样不能做过多的耗时操作。
Q:Activity的启动流程
A:注意!这里并不是要回答Activity的生命周期!
这里可以参考:app的启动
类似于app启动如何创建并进入MainActivity的。
Q:Activity异常退出该如何处理?
A:
Activity异常退出的时候 --> onPause() --> onSaveInstanceState() --> onStop() --> onDestory(),需要注意的是onSaveInstanceState() 方法与onPause并没有严格的先后关系,有可能在onPause之前,也有可能在其后面调用,但会在onStop()方法之前调用;
异常退出后又重新启动该Activity --> onCreate() --> onStart() --> onRestoreInstanceState() --> onResume();
搞懂这个生命周期的执行后就可以回答了,首先要知道面试官的意思,是要重新启动并恢复这个Activity还是说直接退出整个app,如果要恢复则要在onSaveInstanceState()中进行保存数据并在onRestoreInstanceState()中进行恢复,如果是要退出app的话就要捕获全局的异常信息,并退出app。
当然我建议是使用UncaughtExceotionHandler来捕获全局异常进行退出app的操作,这样会减少之前崩溃所造成的后遗症!
Q:Activity的onNewInstent()方法什么时候会执行?
A:这个是启动模式中的了,当此Activity的实例已经存在,并且此时的启动模式为SingleTask和SingleInstance,另外当这个实例位于栈顶且启动模式为SingleTop时也会触发onNewInstent()。
Q:锁定屏与解锁屏幕,Activity如何执行生命周期的?
A:只会调用onPause(),而不会调用onStop方法,开屏后则调用onResume()。
Q:如何修改 Activity 进入和退出动画?
A:
可 以 通 过 两 种 方 式 , 一 是 通 过 定 义 Activity 的 主 题 , 二 是 通 过 覆 写 Activity 的overridePendingTransition 方法。
通过设置主题样式在 styles.xml 中编辑如下代码:
添加 themes.xml 文件:
在 AndroidManifest.xml 中给指定的 Activity 指定 theme。
覆写 overridePendingTransition 方法:
overridePendingTransition(R.anim.fade, R.anim.hold);
Q:Activity间通过Intent传递数据大小有没有限制?
A:Intent在传递数据时是有大小限制的,这里官方并未详细说明,不过通过实验的方法可以测出数据应该被限制在1MB之内(1024KB),笔者采用的是传递Bitmap的方法,发现当图片大小超过1024(准确地说是1020左右)的时候,程序就会出现闪退、停止运行等异常(不同的手机反应不同),因此可以判断Intent的传输容量在1MB之内。
以上是个人的拙见,会不断更新!!
To Be Continued...