2020年Android面试题汇总(初级)

2023-11-10

本博文转载自:https://www.jianshu.com/p/feb9584b492c  作者:Wocus

1.跨进程通信的几种方式

Intent,比如拨打电话
ContentProvider数据库存储数据
Broadcast广播通信
AIDL通信,通过接口共享数据

2.wait和 sleep 的区别

wait是Object的方法,wait是对象锁,锁定方法不让继续执行,当执行notify方法后就会继续执行,sleep 是Thread的方法,sleep 是使线程睡眠,让出cpu,结束后自动继续执行

3.String,StringBuffer,StringBuilder的区别

String不可改变对象,一旦创建就不能修改

String str="aaa";
str="bbb";

以上代码虽然改变了str,但是执行过程是回收str,把值赋给一个新的str
StringBuffer创建之后,可以去修改
StringBuilder也可修改,执行效率高于StringBuffer,不安全
当字符赋值少使用String
字符赋值频繁使用StringBuilder
当多个线程同步操作数据,使用StringBuffer

4.View和SurfaceView的区别

View基于主线程刷新UI,SurfaceView子线程又可以刷新UI

5.View的绘制原理

View为所有图形控件的基类,View的绘制由3个函数完成
measure,计算视图的大小
layout,提供视图要显示的位置
draw,绘制

6.简述JNI

是java和c语言之间的桥梁,由于java是一种半解释语言,可以被反编译出来,一种重要涉及安全的代码就使用了C编程,再者很多底层功能调用C语言都实现了Java没必要重复造轮子,所以定义了JNI接口的实现

7.简述TCP,UDP,Socket

TCP是经过3次握手,4次挥手完成一串数据的传送
UDP是无连接的,知道IP地址和端口号,向其发送数据即可,不管数据是否发送成功
Socket是一种不同计算机,实时连接,比如说传送文件,即时通讯

8.音视频相关类

总体来说,分为几个类
视频录制方面,Camear摄像头录制视频类,MediaProjection屏幕录制视频类
编码方面,MediaCodec,MediaRecorder
预览方面,SurfaceView,GLSurfaceView,TextureView,VideoView

9.进程和线程的区别

概念:进程包括多个线程,一个程序一个进程,多线程的优点可以提高执行效率,提高资源利用率
创建:Thread类和Runnable接口,
常用方法有:
start()用于启动线程
run()调用线程对象中的run方法
join()合并插队到当前线程
sellp()睡眠释放cpu资源
setPriority()设置线程优先级

10.内存泄露如何查看和解决

概念:有些对象只有有限的生命周期,当他们的任务完成之后,它们将被垃圾回收,如果在对象的生命周期本该结束的时候,这个对象还被一系列的引用,着就会导致内存泄露。
解决方法:使用开源框架LeakCanary检测针对性解决
常见的内存泄露有:
单例造成的内存泄露,例如单例中的Context生命周期大于本身Context生命周期
线程使用Hander造成的内存卸扣,当activity已经结束,线程依然在运行更新UI
非静态类使用静态变量导致无法回收释放造成泄露
WebView网页过多造成内存泄露
资源未关闭造成泄露,例如数据库使用完之后关闭连接

11.View的分发机制,滑动冲突

View的事件传递顺序有3个重要的方法,dispatchTouchEvent()是否消耗了本次事件,onInterceptTouchEvent()是否拦截了本次事件,onTouchEvent()是否处理本次事件,滑动冲突分为同方向滑动冲突,例如ScrollView和ListView,同方向滑动冲突,可以计算ListView高度而动态设置ListView的高度,ScrollView高度可变。例如ViewPager和ListView,不同方向滑动冲突,一个是横向滑动一个是竖直滑动,不同方向滑动可以判断滑动的x,y轴是横向还是竖直滑动,如果判断得到是横向滑动,就拦截ListView的事件,竖则反之。

12.RecyclerView和ListView的区别

缓存上:前者缓存的是View+ViewHolder+flag,不用每次调用findViewById,后者则只是缓存View
刷新数据方面,前者提供了局部刷新,后者则全部刷新

13.recyclerView嵌套卡顿解决如何解决

设置预加载的数量LinearLayoutManager.setInitialPrefetchItemCount(4),默认是预加载2个,
设置子项缓存,
设置自带滑动冲突解决属性rv.setHasFixedSize(true); rv.setNestedScrollingEnabled(false);
可以完美解决,不过Google不推荐RecyClerView嵌套使用,需要嵌套尽量找类似于ExpandableListView 第三方控件来解决

14,谈MVC ,MVP,MVVM

MVC:View是可以直接访问Model的!从而,View里会包含Model信息,不可避免的还要包括一些 业务逻辑。 在MVC模型里,更关注的Model的不变,而同时有多个对Model的不同显示,及View。所以,在MVC模型里,Model不依赖于View,但是 View是依赖于Model的。不仅如此,因为有一些业务逻辑在View里实现了,导致要更改View也是比较困难的,至少那些业务逻辑是无法重用的。
MVP:MVP 是从经典的模式MVC演变而来,它们的基本思想有相通的地方:Controller/Presenter负责逻辑的处理,Model提供数据,View负 责显示。作为一种新的模式,MVP与MVC有着一个重大的区别:在MVP中View并不直接使用Model,它们之间的通信是通过Presenter (MVC中的Controller)来进行的,所有的交互都发生在Presenter内部,而在MVC中View会从直接Model中读取数据而不是通过 Controller。
MVVM:数据双向绑定,通过数据驱动UI,M提供数据,V视图,VM即数据驱动层

15.dagger2

Dagger2是一个主要用于依赖注入的框架,减少初始化对象操作,降低耦合度

16Android性能优化

布局优化: 减少布局层级,使用ViewStub提高显示速度,布局服用,尽可能少使用warp_content,删除空间中无用的属性,避免过度绘制移除window默认背景,按需显示展位图,自定义View优化,使用canvas.clipRect()识别可见区域
启动速度:采用分布加载,异步加载,延期加载提高应用初始化速度,采用线程初始化数据等,合理的刷新机制
内存方面:防止内存泄露,使用一些第三方工具检测解决
代码优化:遵循Java生命周期
安装包优化:删除无用资源,优化图片,代码混淆,避免重复库存在,插件化

17.Hander原理

Handler,loop轮询检测发送消息到MessagerQuery,MessageQuery对Message入列,Handler回调方法处理消息,重写handMessage方法刷新ui

18.SharedPreference跨进程使用会怎么样?如何保证跨进程使用安全?

在两个应用的manifest配置中好相同的shartdUserId属性,A应用正常保存数据,B应用
createPackageContext("com.netease.nim.demo", CONTEXT_IGNORE_SECURITY)
获取context然后获取应用数据,为保证数据安全,使用加密存储

19.推送到达率如何提高

判手机系统,小米使用小米推送,华为使用华为推送,其他手机使用友盟推送

20.activity,fragment传值问题

通过Bundle传值,在activty定义变量传值,扩展fragment创建传值

21.activity与fragment区别

生命周期:
fragment从创建倒销毁整个生命周期依次为onAttach()→onCreate()→onCreateView()→onActivityCreated()→onStart()→onResume()→onPause()→onStop()→onDestroyView()→onDestroy()→onDetach()
与activity不同的方法有
onAttach():当Fragment和Activity建立关联的时候调用;
onCreateView():当Fragment创建视图调用;
onActivityCreated:与Fragment相关联的Activity完成onCreate()之后调用;
onDestoryView():在Fragment中的布局被移除时调用;
onDetach():当Fragment和Activity解除关联时调用;
activity常用的生命周期只有以下几个;
onCreate(): 表示 Activity 正在被创建,常用来 初始化工作,比如调用 setContentView 加载界面布局资源,初始化 Activity 所需数据等;
onRestart():表示 Activity 正在重新启动,一般情况下,当前Acitivty 从不可见重新变为可见时,OnRestart就会被调用;
onStart(): 表示 Activity 正在被启动,此时 Activity 可见但不在前台,还处于后台,无法与用户交互;
onResume(): 表示 Activity 获得焦点,此时 Activity 可见且在前台并开始活动,这是与 onStart 的区别所在;
onPause(): 表示 Activity 正在停止,此时可做一些 存储数据、停止动画等工作,但是不能太耗时,因为这会影响到新 Activity的显示,onPause 必须先执行完,新 Activity 的 onResume 才会执行;
onStop(): 表示 Activity 即将停止,可以做一些稍微重量级的回收工作,比如注销广播接收器、关闭网络连接等,同样不能太耗时;
onDestroy(): 表示 Activity 即将被销毁,这是 Activity 生命周期中的最后一个回调,常做 回收工作、资源释放;
区别:
Fragment比Activity多出四个回调周期,控制操作上更灵活;
Fragment可以在xml文件中直接写入,也可以在Activity中动态添加;
Fragment可以使用show()/hide()或者replace()对Fragment进行切换,切换的时候不会出现明显的效果,Activity切换的时候会有明显的翻页或其他效果;

22.Fragment中add与replace的区别?

add不会重新初始化fragment,replace每次都会;
添加相同的fragment时,replace不会有任何变化,add会报IllegalStateException 异常;
replace 先 remove 掉相同 id 的所有 fragment,然后在add 当前的这个 fragment,而 add 是覆盖前一个fragment。所以如果使用 add 一般会伴随 hide()和show(),避免布局重叠;
使用 add,如果应用放在后台,或以其他方式被系统销毁,再打开时,hide()中引用的 fragment 会销毁,所以依然会出现布局重叠 bug,可以使用 replace 或使用 add时,添加一个 tag 参数;

23.FragmentPagerAdapter 与 与 FragmentStatePagerAdapter 的区别与使用场景?

FragmentPagerAdapter 的每个 Fragment 会持久的保存在 FragmentManager 中,只要用户可以返回到页面中,它都不会被销毁。因此适用于那些数据 相对静态的页,Fragment 数量也比较少的那种;FragmentStatePagerAdapter 只保留当前页面,当页面不可见时,该 Fragment 就会被消除,释放其资源。因此适用于那些 数据动态性较大、 占用内存较多,多 Fragment 的情况;

24.说下Activity 的四种启动模式、应用场景 ?

standard 标准模式: 每次启动一个 Activity 都会重新创建一个新的实例,不管这个实例是否已经存在,此模式的 Activity 默认会进入启动它的 Activity 所属的任务栈中;
singleTop 栈顶复用模式: 如果新 Activity 已经位于任务栈的栈顶,那么此 Activity 不会被重新创建,同时会回调 onNewIntent方法,如果新 Activity 实例已经存在但不在栈顶,那么Activity 依然会被重新创建;
singleTask 栈内复用模式: 只要 Activity 在一个任务栈中存在,那么多次启动此 Activity 都不会重新创建实例,并回调onNewIntent 方法,此模式启动 Activity A,系统首先会寻找是否存在 A 想要的任务栈,如果不存在,就会重新创建一个任务栈,然后把创建好 A 的实例放到栈中;
singleInstance单实例模式: 这是一种加强的 singleTask 模式,具有此种模式的 Activity 只能单独地位于一个任务栈中,且此任务栈中只有唯一一个实例;

25.说下 Activity 跟 跟 window , view 之间的关系?

Activity 创建时通过 attach()初始化了一个 Window 也就是PhoneWindow,一个 PhoneWindow 持有一个DecorView 的实例,DecorView 本身是一个 FrameLayout,继承于 View,Activty 通过setContentView 将xml 布局控件不断 addView()添加到 View 中,最终显示到 Window 于我们交互;

26.横竖屏切换的Activity 生命周期变化?

不设置 Activity 的 android:configChanges 时,切屏会销毁当前Activity,然后重新加载调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次;onPause()→onStop()→onDestory()→onCreate()→onStart()→onResume()
设置 Activity 的 android:configChanges=" orientation",经过机型测试
在 Android5.1 即 即 API 3 23 级别下,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次
在 Android9 即 即 API 8 28 级别下,切屏不会重新调用各个生命周期,只会执行 onConfigurationChanged方法
官方纠正后,原话如下
如果您的应用面向 Android 2 3.2 即 即 API 级别 3 13 或更
高级别(按照 minSdkVersion 和 targetSdkVersion)

未完待续......

2020年Android面试题汇总(中级)​​​​​​​




 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

2020年Android面试题汇总(初级) 的相关文章

  • 记一次从web到内网的渗透

    记一次从web到内网的渗透 拓扑图 环境介绍 现在有三台机器 分别为target1 target2 target3 里面分别有三个flag 每个flag的分值不同 需要通过拿下一个已知IP target1 进而向内网里面进行渗透 最终要成功

随机推荐

  • 字符设备驱动程序

    字符设备驱动程序 下面以一个简单的例子来讲解下字符设备驱动程序 首先需要有内核环境 Linux下的设备驱动程序被组织为一组完成不同任务的函数的集合 通过这些函数使得Windows的设备操作犹如文件一般 在应用程序看来 硬件设备只 是一个设备
  • 淘宝客app源码如何选择技术栈?

    选择技术栈是开发淘宝客App的重要决策 它将直接影响到开发效率和产品质量 首先 选择技术栈的时候需要考虑淘宝客App的功能和需求 淘宝客App作为一个电商平台 涉及到用户登录 商品展示 下单支付 优惠券等功能 因此选择的技术栈需要支持这些功
  • linux篇【12】:网络套接字<中序>——tcp

    目录 查看TCP网络服务器情况和端口使用情况 netstat nltp 一 TCP套接字接口 1 inet aton 和inet addr一样 换一种方式而已 2 listen 把套接字设置为监听状态 3 服务器获取客户端的连接 accep
  • c++中整形输入逗号_很重要的收集 --- 关于c++的各种输入(包括istream_iterator结合逗号分隔)...

    最近又开始刷题了 在这个过程中 我不断地发现一个问题 就是不同的题目会有不同的输入要求 而如果用c 这么繁复的语言在刷题的时候 有时候光是一个输入就会把所有的时间都消耗得一干二净 因此我在这里设立一篇文章用来记录不同的输入方式 本篇文章采取
  • SpringBoot基本操作(七)——SpringBoot整合Shiro权限管理(完整demo+界面)

    SpringBoot2 0笔记 一 SpringBoot基本操作 环境搭建及项目创建 有demo 二 SpringBoot基本操作 使用IDEA打war包发布及测试 三 SpringBoot基本操作 SpringBoot整合SpringDa
  • 城市级海量数据流畅调度方案(初稿)

    城市级海量数据流畅调度方案 初稿 一 系统约束 1 硬件限制 CPU 显卡 内存 硬盘 最耗费CPU时间的是 视锥体和boundSphere boundBox的求交计算 显卡现在最大的瓶颈是 当渲染批次多时 2000个primitivese
  • 页面中各种标签中链接地址(href src action)的区别

    页面中各种标签中链接地址 href src action 的区别 1 href是a标签的链接 表示点击a标签需要跳转到哪里 例如 a href demo index jsp 跳转到首页 a 2 action是form表单的地址 表示表单需要
  • chrome浏览器 下载网页视频的方法

    有时候 我们在网上浏览到一些制作的非常好视频 但是网页又不提供视频下载 怎么办呢 工具 Chrome浏览器 迅雷 这里我们以Chrome浏览器为例 其他浏览器同理 步骤 1 在视频播放页面 我们在空白处 单击右键出现下列菜单 点击 检查 或
  • L1 L2范式

    正则化 Regularization 机器学习中几乎都可以看到损失函数后面会添加一个额外项 常用的额外项一般有两种 一般英文称作 1 1 norm和 2 2 norm 中文称作L1正则化和L2正则化 或者L1范数和L2范数 L1正则化和L2
  • 高通Vuforia AR SDK CloudReco案例

    1 云端数据库的建立 包括数据库的Accsse Key 其中 Server Access Keys是被用于VWS服务的 主要用来上传图片和管理图片 Client Access Keys被用于APP中图片识别服务而搜索数据库 标志的设置 一般
  • [WolframTones] an experiment in a new kind of music

    WolframTones an experiment in a new kind of music made possible by Mathematica and A New Kind of Science http tones wolf
  • Python如何读写配置文件?

    目录 什么是配置文件 常见的配置文件格式 为什么要使用配置文件 Python如何读写配置文件 什么是配置文件 配置文件是用于存储程序或系统的设置和配置选项的文本文件 它通常以特定的格式编写 以便程序或系统可以读取和解析其中的配置信息 配置文
  • uos桌面专业版下载多架构软件安装包

    文章目录 一 进入文件下载目录 二 下载软件包及其依赖包 三 安装下载好的deb包 一 进入文件下载目录 进入apt缓存目录后 将多余的deb包全部删除 uos uos PC var cache apt archives cd var ca
  • Android开源框架之okhttp

    OKHttp是一款高效的HTTP客户端 支持连接同一地址的链接共享同一个socket 通过连接池来减小响应延迟 还有透明的GZIP压缩 请求缓存等优势 其核心主要有路由 连接协议 拦截器 代理 安全性认证 连接池以及网络适配 拦截器主要是指
  • 编程大杂烩(四)

    编程大杂烩 四 57 Linux常用命令 版权声明 本文为CSDN博主 Demon gu 的原创文章 遵循CC 4 0 BY SA版权协议 转载请附上原文出处链接及本声明 原文链接 https blog csdn net qq 233291
  • Servlet学习——为什么在web容器中servlet对象只有一个?

    以下为本人个人观点 如有错误 望指出 不胜感激 简单来说就是为了节省内存 servlet的设计非常的巧妙 如果我们对每一个用户请求都生成一个对应servlet的对象 第一 由于web服务器的访问量比较大 意味着内存开销会很大 第二 要GC大
  • 全栈之前端

    欢迎关注 全栈工程师修炼指南 公众号 点击 下方卡片 即可关注我哟 设为 星标 每天带你 基础入门 到 进阶实践 再到 放弃学习 花开堪折直须折 莫待无花空折枝 作者主页 https www weiyigeek top 博客 https b
  • Python程序笔记2023004

    文章目录 抛硬币实验 random 模块 最初版本 改进版本 1 改进版本 2 语法分析 1 语法分析 2 语法分析 3 改进版本 3 改进版本 4 代码分析 1 代码分析 2 代码分析 3 代码分析 4 抛硬币实验 random 模块 i
  • 《Mysql实战45讲》网盘链接

    链接 https pan baidu com s 14fq7BzQD4sIBjYeh1sElQw 提取码 1119
  • 2020年Android面试题汇总(初级)

    本博文转载自 https www jianshu com p feb9584b492c 作者 Wocus 1 跨进程通信的几种方式 Intent 比如拨打电话 ContentProvider数据库存储数据 Broadcast广播通信 AID