Android面试题

Android是一种基于Linux的自由及开放源代码的操作系统; 主要使用于移动设备,如智能手机和平板电脑,由Google公司和开放手机联盟领导及开发;这里会不断收集和更新Android基础相关的面试题
Android系统的架构
Android系统架构之应用程序
Android会同一系列核心应用程序包一起发布,该应用程序包包括email客户端,SMS短消息程序,日历,地图,浏览器,联系人管理程序等;所有的应用程序都是使用JAVA语言编写的
Android系统架构之应用程序框架
开发人员可以完全访问核心应用程序所使用的API框架(android.jar);该应用程序的架构设计简化了组件的重用;任何一个应用程序都可以发布它的功能块并且任何其它的应用程序都可以使用其所发布的功能块
Android系统架构之系统运行库
Android 包含一些C/C++库,这些库能被Android系统中不同的组件使用;它们通过 Android 应用程序框架为开发者提供服务
Android系统架构之Linux 内核
Android 的核心系统服务依赖于 Linux 2.6 内核,如安全性,内存管理,进程管理, 网络协议栈和驱动模型;Linux 内核也同时作为硬件和软件栈之间的抽象层
Android中的ANR
- ANR的全称application not responding 应用程序未响应
- 在android中Activity的最长执行时间是5秒
- BroadcastReceiver的最长执行时间则是10秒
- Service的最长执行时间则是20秒
- 超出执行时间就会产生ANR;注意:ANR是系统抛出的异常,程序是捕捉不了这个异常的
解决方法:
运行在主线程里的任何方法都尽可能少做事情; 特别是,Activity应该在它的关键生命周期方法 (如onCreate()和onResume())里尽可能少的去做创建操作(可以采用重新开启子线程的方式,然后使用Handler+Message 的方式做一些操作,比如更新主线程中的ui等)
应用程序应该避免在BroadcastReceiver里做耗时的操作或计算; 但不再是在子线程里做这些任务(因为 BroadcastReceiver的生命周期短),替代的是,如果响应Intent广播需要执行一个耗时的动作的话,应用程序应该启动一个 Service
Fragment的生命周期
Fragment的生命周期与Activity生命周期对比:
Fragment的生命周期方法主要有onAttach()、onCreate()、onCreateView()、onActivityCreated()、onstart()、onResume()、onPause()、onStop()、onDestroyView()、onDestroy()、onDetach()等11个方法
切换到该Fragment,分别执行onAttach()、onCreate()、onCreateView()、onActivityCreated()、onstart()、onResume()方法
锁屏; 分别执行onPause()、onStop()方法
亮屏; 分别执行onstart()、onResume()方法
覆盖; 切换到其他Fragment,分别执行onPause()、onStop()、onDestroyView()方法
从其他Fragment回到之前Fragment,分别执行onCreateView()、onActivityCreated()、onstart()、onResume()方法
Service生命周期
在Service的生命周期里;常用的有:
4个手动调用的方法
- startService() 启动服务
- stopService() 关闭服务
- bindService() 绑定服务
- unbindService() 解绑服务
5个内部自动调用的方法
- onCreat() 创建服务
- onStartCommand() 开始服务
- onDestroy() 销毁服务
- onBind() 绑定服务
- onUnbind() 解绑服务
手动调用startService()启动服务,自动调用内部方法: onCreate()、onStartCommand(),如果一个Service被startService()多次启动,那么onCreate()也只会调用一次
手动调用stopService()关闭服务,自动调用内部方法: onDestory(),如果一个Service被启动且被绑定,如果在没有解绑的前提下使用stopService()关闭服务是无法停止服务的
手动调用bindService()后,自动调用内部方法: onCreate()、onBind()
手动调用unbindService()后,自动调用内部方法: onUnbind()、onDestory()
startService()和stopService()只能开启和关闭Service,无法操作Service,调用者退出后Service仍然存在;bindService()和unbindService()可以操作Service,调用者退出后,Service随着调用者销毁
Android中4大组件
Activity: Activity是Android程序与用户交互的窗口,是Android构造块中最基本的一种,它需要为保持各界面的状态,做很多持久化的事情,妥善管理生命周期以及一些跳转逻辑
BroadCast Receiver: 接受一种或者多种Intent作触发事件,接受相关消息,做一些简单处理,转换成一条Notification,统一了Android的事件广播模型
Content Provider: 是Android提供的第三方应用数据的访问方案,可以派生Content Provider类,对外提供数据,可以像数据库一样进行选择排序,屏蔽内部数据的存储细节,向外提供统一的接口模型,大大简化上层应用,对数据的整合提 供了更方便的途径
service: 后台服务于Activity,封装有一个完整的功能逻辑实现,接受上层指令,完成相关的事务,定义好需要接受的Intent提供同步和异步的接口
View、surfaceView、GLSurfaceView
View
显示视图,内置画布,提供图形绘制函数、触屏事件、按键事件函数等,必须在UI主线程内更新画面,速度较慢
SurfaceView
基于view视图进行拓展的视图类,更适合2D游戏的开发,是view的子类,类似使用双缓机制,在新的线程中更新画面所以刷新界面速度比view快
GLSurfaceView
基于SurfaceView视图再次进行拓展的视图类,专用于3D游戏开发的视图,是surfaceView的子类,openGL专用
AsyncTask
AsyncTask的三个泛型参数说明
- 第一个参数: 传入doInBackground()方法的参数类型
- 第二个参数: 传入onProgressUpdate()方法的参数类型
- 第三个参数: 传入onPostExecute()方法的参数类型,也是doInBackground()方法返回的类型
AsyncTask的执行分为四个步骤
- 继承AsyncTask
- 实现AsyncTask中定义的下面一个或几个方法onPreExecute()、doInBackground(Params...)、onProgressUpdate(Progress...)、onPostExecute(Result)
- 调用execute方法必须在UI thread中调用
- 该task只能被执行一次,否则多次调用时将会出现异常,取消任务可调用cancel
ListView优化
convertView重用; 利用好 convertView 来重用 View,切忌每次 getView() 都新建;ListView 的核心原理就是重用 View,如果重用 view 不改变宽高,重用View可以减少重新分配缓存造成的内存频繁分配/回收
ViewHolder优化; 使用ViewHolder的原因是findViewById方法耗时较大,如果控件个数过多,会严重影响性能,而使用ViewHolder主要是为了可以省去这个时间;通过setTag,getTag直接获取View
减少Item View的布局层级; 这是所有layout都必须遵循的,布局层级过深会直接导致View的测量与绘制浪费大量的时间
- adapter中的getView方法尽量少使用逻辑
- 图片加载采用三级缓存,避免每次都要重新加载
- 尝试开启硬件加速来使ListView的滑动更加流畅
- 使用 RecycleView 代替
说了这么多,其实最重要的就是一句话,问问你自己:
你现在所拥有的技术层次真的有信心步入更高阶的程序员当中吗?
近段时间我这里整理了一份完整的《2022年 Android 中高级面试题汇总》希望这份系统化的技术体系对大家有一个方向参考

有需要的同学,可以顺手给我点赞评论支持一下
内容如果对大家有用的话,可以转发分享一下
获取方式:
点击:《2022年 Android 中高级面试题汇总》即可免费获取
《2022年 Android 中高级面试题汇总》
由于篇幅有限,仅展示部分内容
第一章 Java 基础
第一节 静态内部类和非静态内部类的比较
1.1 静态内部类和非静态内部类的区别
1.2 扩展:内部类都有哪些?
1.3 同部内部类
1.4 匿名内部类:是一种没有炎名的内部类
第二节 多态的理解与应用
2.1 多态概述
2.2 多态中成员的持点
2.3 instanceof关桩字
2.4 多态的转型
2.5 多态案例

第三节 java 方法的多态性理解
3.1 什么是java的多态
3.2 远行时多态3.3代码理解
3.4 深一点
3.5 再深一点
3.6 最后一个炼习
第四节 java中接口和选承的区别
第五节 线程池的好处,详解,单例(绝对好记)
5.1 线程池的好处
5.2 线程池的详解
5.3 线程池的单例

第二章 Android 基础
第一节 Activity 知识点(必问)
1.1 Activity 启动过程全解析
1.2 启动模式以及使用场景
1.3 onSavelnstanceStatelJBonRestorelnstar
1.4onConfigurationChanged使用以及问题解决

第二节 Fragment 知识点
2.1 Fragment的通信问题,新建Fragment为何不
2.2 为什么官方推荐Fragment.setArguments(B
2.3 Androidx下Fragment懒加载的新实现
2.4 Fragment全解析系列(一):那些年深过的
2.5 Google-Fragment 概览
2.6 Google -与其他 Fragment 通信

第三节 Service 知识点
3.1 Handle 知识点(必问)
3.2 Android 主线程阻塞处理及优化
3.3深入聊聊Android消息机制中的消息队列的
3.4深入理解MessageQueue
3.5 你真的懂Handler.postDelayed(的原理吗?
3.6 Handler.postDelayed0是如何精确延迟指成
3.7 Handler 延迟消息执行机制,会阻塞吗?
第四节Intent知识点
4.1 Android 跨进程传递大内存数据
4.2 数据存健

获取方式:
点击:《2022年 Android 中高级面试题汇总》即可免费获取
技术是无止境的,你需要对自己提交的每一行代码、使用的每一个工具负责,不断挖掘其底层原理,才能使自己的技术升华到更高的层面
Android 架构师之路还很漫长,与君共勉
PS:有问题欢迎指正,可以在评论区留下你的建议和感受;
欢迎大家点赞评论,觉得内容可以的话,可以转发分享一下
网友评论