android 面试题
### Android面试知识点详解 #### 一、Android系统架构 Android系统架构主要分为四层:应用程序层、应用程序框架层、核心类库以及Linux内核。每一层都有其独特的功能与职责。 1. **应用程序层**:包含一系列预安装的应用程序,如电话拨号器、联系人管理、短信工具等。这些应用都是用Java语言编写的,并且可以通过Android SDK来创建自己的应用。 2. **应用程序框架层**:提供了开发者创建应用程序所需的API。这一层包含了关键的Android组件,如Activity Manager(用于管理应用程序生命周期并提供导航回退堆栈)、Content Providers(用于访问应用程序特定的数据)、View System(构建应用程序UI界面的基础组件集合)、Notification Manager(允许应用程序显示用户提示信息)等。 3. **核心类库**:包含了一系列的核心库,这些库支持各种应用组件的功能实现,同时提供了一个用于高性能的媒体子系统。这一层还支持部分非Java语言(如C/C++)的应用程序,通过Native Development Kit (NDK) 实现。 4. **Linux内核**:这是整个系统软件的底层。它负责实现硬件抽象层,提供基本服务,如电源管理、内存管理、进程管理等,并且提供了对硬件设备的驱动支持。 #### 二、五种常用的布局模式 1. **FrameLayout(框架布局)**:是最简单的布局,它将所有子视图放置在其左上角位置,适合做浮动窗口或叠加效果。 2. **LinearLayout(线性布局)**:按照水平或垂直方向排列子视图,是最常用的布局之一。 3. **AbsoluteLayout(绝对布局)**:允许子视图相对于父容器指定精确的位置,但由于定位不够灵活,在实际开发中较少使用。 4. **RelativeLayout(相对布局)**:根据其他视图的位置来定位子视图,可以减少布局嵌套层次,提高布局性能。 5. **TableLayout(表格布局)**:适用于表格数据展示,子视图可以按行、列进行排列。 #### 三、五种数据存储方式 1. **SharedPreferences**:轻量级的存储方式,以XML格式保存在手机上,适合存储少量数据。 2. **SQLite数据库**:轻量级的嵌入式数据库引擎,支持基本的SQL语法,适合存储大量结构化的数据。 3. **文件存储**:通过File对象读写文件,可以保存文本、图像等多种格式的数据。 4. **ContentProvider**:为不同的应用程序提供统一的数据访问接口,可以跨进程共享数据。 5. **网络存储**:通过HTTP协议将数据保存到远程服务器,适用于云存储等场景。 #### 四、View、SurfaceView、GLSurfaceView的区别 1. **View**:是Android中最基本的UI组件,可以用来绘制简单的图形或处理触摸事件。适合被动更新画面的情况,例如棋盘游戏,其中的画面更新依赖于用户的触摸事件。 2. **SurfaceView**:用于主动更新画面的场景,可以在一个独立的线程中更新画面,从而不会阻塞UI线程。适用于需要频繁更新画面的应用,如跑动的人物动画。 3. **GLSurfaceView**:专门用于OpenGL ES图形渲染的SurfaceView,可以充分利用硬件的GPU加速能力。相比于普通的SurfaceView,GLSurfaceView在3D图形渲染方面性能更优,但是其适配性和兼容性可能不如SurfaceView广泛。 #### 五、Adapter的作用及常见类型 1. **Adapter的作用**:Adapter作为数据模型和UI视图之间的桥梁,负责将数据填充到View组件中,使得数据绑定变得更加简单和灵活。 2. **常见的Adapter类型**: - **ArrayAdapter**:用于显示数组中的数据。 - **SimpleCursorAdapter**:用于显示Cursor中的数据。 - **CursorAdapter**:提供了一种通用的方式来处理Cursor数据。 - **ResourceCursorAdapter**:基于CursorAdapter,使用特定的资源文件来显示数据。 - **BaseAdapter**:提供了一个基础的Adapter框架,可以通过继承该类来自定义Adapter。 #### 六、横竖屏切换时Activity的生命周期变化 1. **默认情况下**:如果不设置Activity的`android:configChanges`属性,切屏会重新调用各个生命周期方法,横屏时执行一次,竖屏时执行两次。 2. **设置为orientation**:如果设置`android:configChanges="orientation"`,切屏时仍会重新调用各个生命周期方法,但是横屏和竖屏时只会执行一次。 3. **设置为orientation|keyboardHidden**:如果设置`android:configChanges="orientation|keyboardHidden"`,切屏时不会重新调用各个生命周期方法,而是仅执行`onConfigurationChanged()`方法。 #### 七、Activity的完整生命周期 - **onCreate()**:首次创建Activity时调用。 - **onStart()**:Activity变为可见时调用。 - **onResume()**:Activity获取用户焦点,变得可交互时调用。 - **onPause()**:Activity失去焦点但仍可见时调用。 - **onStop()**:Activity完全不可见时调用。 - **onDestroy()**:Activity即将被销毁时调用。 - **onRestart()**:Activity由停止状态变为重新启动状态时调用。 此外,当Activity部分或全部被覆盖时,生命周期也会发生变化。例如,按下Home键时,Activity会依次经历`onSaveInstanceState()`、`onPause()`、`onStop()`。而当再次回到Activity时,则依次经历`onRestart()`、`onStart()`、`onResume()`。 通过深入理解这些基础知识,可以帮助开发者更好地掌握Android应用程序的开发技巧,提高应用的性能和用户体验。