Android面试题整理(一)
2017-10-18 本文已影响124人
程序员丶星霖
Android面试题整理(一)
1.Activity和Fragment的生命周期有哪些?
(1)Activity的生命周期主要有onCreate()、onStart()、onResume()、onPause()、onStop()、onDestory()、onRestart()7个生命周期。
- 当启动Activity时,其生命周期如下图所示:
- 当手机锁屏时,其生命周期如下图所示:
- 当手机解锁时,其生命周期如下图所示:
- 当销毁正在运行的Activity时,其生命周期如下图所示:
- 当从一个运行的Activity跳转到另一个Activity时(原Activity运行在后台),其生命周期如下图所示:
- 当finish掉SecondActivity时,后台运行的Activity返回到前台时,其生命周期如下图所示:
- 当不设置Activity的android:configChanges时,切横屏时的生命周期如下图所示:
- 当不设置Activity的android:configChanges时,切竖屏时的生命周期如下图所示:
- 当设置Activity的android:configChanges="orientation"时,切横屏时的生命周期如下图所示(真机测试结果不一样):
- 当设置Activity的android:configChanges="orientation"时,再次切竖屏时的生命周期如下图所示(真机测试结果不一样):
- 当设置Activity的android:configChanges="orientation | keyboardHidden"时,切横屏时的生命周期如下图所示(真机测试结果不一样):
- 当设置Activity的android:configChanges="orientation | keyboardHidden"时,再次切竖屏时的生命周期如下图所示(真机测试结果不一样):
- 当按下手机HOME键时,其生命周期如下图所示:
(2)Fragment的生命周期有onAttach()、onCreate()、onCreateView()、onActivityCreated()、onStart()、onResume()、onPause()、onStop()、onDestoryView()、onDestory()、onDetach()11个生命周期。
- 当启动Fragment时,其生命周期如下图所示:
- 当手机锁屏时,其生命周期如下图所示:
- 当手机解锁时,其生命周期如下图所示:
- 当销毁正在运行的Activity时,其生命周期如下图所示:
- 当从一个运行的Activity跳转到另一个Activity时(原Activity运行在后台),其生命周期如下图所示:
- 当finish掉SecondActivity时,后台运行的Activity返回到前台时,其生命周期如下图所示:
- 当按下手机HOME键时,其生命周期如下图所示:
(3)Fragment的生命周期与Activity的生命周期是什么样的关系?
- 其关系如下图所示:
2.Activity的四种启动模式以及使用场景
任务栈是一种后进先出的结构。位于栈顶的Activity处于焦点状态,当按下back按键的时候,栈内的Activity会一个一个的出栈,并且调用其onDestory()方法。如果栈内没有Activity,那么系统就会回收这个栈,,每个APP默认只有一个栈,是以APP的包名来命名的。
- standard模式
- 标准模式,每次启动Activity时都会创建一个新的Activity实例,并且将其压入任务栈栈顶,而不管这个Activity是否已经存在。Activity的启动三回调都会执行(onCreate()、onStart()、onResume())。
- 使用场景:大多数Activity。
- singleTop模式
-
栈顶复用模式,如果新的Activity已经位于任务栈的栈顶,那么Activity不会被重新创建,所以它的启动三回调不会执行,同时
Activity的onNewIntent()
方法会被回调;如果Activity已经存在但是不在栈顶,那么作用和standard模式一样。 - 使用场景:新闻类或者阅读类APP的内容页面
- singleTask模式
- 栈内复用模式,如果在栈中已经有该Activity的实例,就重用该实例(调用该实例的onNewIntent()方法)。重用时,会让该实例回到栈顶,将它上面的实例移出栈。如果栈中不存在该实例,将会创建新的实例放入栈中。
- 使用场景:浏览器的主界面(不管从多少个应用启动浏览器,只会启动主界面一次,其余情况都会走onNewIntent(),并且会清空主界面上的其他页面)。
- singleInstance模式
- 加强版的singleTask模式,这种模式的Activity只能单独位于一个任务栈内,由于栈内复用的特性,后续请求均不会创建新的Activity,除非该任务栈被系统销毁了。其效果相当于多个应用共享一个应用,不管谁激活该Activity都会进入同一个应用中。
- 使用场景:闹铃提醒,将闹铃提醒与闹铃设置分离。
3.onSaveInstanceState()和onRestoreInstanceState()方法、
- onSaveInstanceState()的调用时机:
- 当用户按下HOME键时;
- 长按HOME键,选择运行其他的程序时;
- 按下电源按键(关闭屏幕显示)时;
- 从activity A中启动一个新的Activity B时;
- 屏幕方向切换时;
- 调用遵循的原则:当系统存在“未经许可”销毁了我们的Activity的可能时,该方法会被调用。
- onRestoreInstanceState()的调用时机:
- 该方法被调用的前提是,Activity“确实”被系统销毁掉了。
4.Android中的进程优先级?
根据进程的重要性,划分为一下5级:
- 前台进程(Foreground process):用户当前操作所必需的进程。通常在任意给定时间前台进程都为数不多。只有在内存不足以支持它们同时继续运行的情况下,系统才会终止它们。
- 拥有用户正在进行交互的Activity(已调用onResume()方法);
- 拥有某个Service,绑定到用户正在交互的Activity;
- 拥有正在“前台”运行的Service(服务已调用startForeground())
- 拥有正执行一个生命周期回调的Service(onCreate()、onStart()或onDestory())
- 拥有正执行其onReceive()方法的BroadcastReceiver
- 可见进程(Visible process):没有任何前台组件、但仍会影响用户在屏幕上所见内容的进程。可见进程被视为是极其重要的进程,除非为了维持所有前台进程同时运行而必须终止,否则系统不会终止这些进程。
- 拥有不在前台、但仍对用户可见的Activity(已调用onPause())
- 拥有绑定到可见Activity的Service
- 服务进程(Service process):其中运行着使用startService方法启动的Service,虽然不被用户可见,但是却是用户关心的。当系统需要空间运行前两者进程时才会被终止。
- 正在运行startService()方法启动的服务,且不属于上述两个更高类别进程的进程
- 后台进程(Background process):后台进程对用户体验没有直接影响,系统可能随时终止它们,以回收内存供前台进程、可见进程或服务进程使用。 通常会有很多后台进程在运行,因此它们会保存在 LRU 列表中,以确保包含用户最近查看的 Activity 的进程最后一个被终止。
- 对用户不可见的Activity的进程(已调用onStop()方法)
- 空进程(Empty process):保留这种进程的的唯一目的是用作缓存,以缩短下次在其中运行组件所需的启动时间。 为使总体系统资源在进程缓存和底层内核缓存之间保持平衡,系统往往会终止这些进程。
- 不含任何应用组件的进程