jjzjj

2023 Android面试官 常问的问题以及答案(附最新的Android面试大厂必考174题 )

上马定江山 2023-04-20 原文

前言

已经2023了 但是计算机的寒冬还没有过去 ,但是我们程序员的热情不会被磨灭(有钱就干 越多越有劲)。在这个金三银四的季节 许多公司也发布了更多的招聘岗位 面试机会多了 那我们跟要把握住。以下分享一些面试题给大家,希望能帮到大家找一份好工作。

1.Android与服务器交互的方式中的对称加密和非对称加密是什么

对称加密,就是加密和解密数据都是使用同一个key,这方面的算法有DES。
非对称加密,加密和解密是使用不同的key。发送数据之前要先和服务端约定生成公钥和私钥,使用公钥加密的数据可以用私钥解密,反之。这方面的算法有RSA。ssh 和 ssl都是典型的非对称加密。

2.Android启动Service的两种方式是什么? 它们的适用情况是什么?
如果后台服务开始后基本可以独立运行的话,可以用startService。音乐播放器就可以这样用。它们会一直运行直到你调用 stopSelf或者stopService。你可以通过发送Intent或者接收Intent来与正在运行的后台服务通信,但大部分时间,你只是启动服务并让它独立运行。如果你需要与后台服务通过一个持续的连接来比较频繁地通信,建议使用bind()。比如你需要定位服务不停地把更新后的地理位置传给UI。Binder比Intent开发起来复杂一些,但如果真的需要,你也只能使用它。
startService:生命周期与调用者不同。启动后若调用者未调用stopService而直接退出,Service仍会运行
bindService:生命周期与调用者绑定,调用者一旦退出,Service就会调用unBind->onDestroy

3.谈谈你对binder机制的理解?
binder是一种IPC机制,进程间通讯的一种工具.
Java层可以利用aidl工具来实现相应的接口.

4.Android中进程间通信有哪些实现方式?
Intent,Binder(AIDL),Messenger,BroadcastReceiver

5.介绍下实现一个自定义view的基本流程
1、自定义View的属性 编写attr.xml文件
2、在layout布局文件中引用,同时引用命名空间
3、在View的构造方法中获得我们自定义的属性 ,在自定义 控件中进行读取(构造方法拿到attr.xml文件值)
4、重写onMesure
5、重写onDraw

6.Android中touch事件的传递机制是怎样的?
1.Touch事件传递的相关API有dispatchTouchEvent、 onTouchEvent、onInterceptTouchEvent
2.Touch事件相关的类有View、ViewGroup、Activity
3.Touch事件会被封装成MotionEvent对象,该对象封装了手 势按下、移动、松开等动作
4.Touch事件通常从Activity#dispatchTouchEvent发出,只要 没有被消费,会一直往下传递,到最底层的View。
5.如果Touch事件传递到的每个View都不消费事件,那么Touch事件会反向向上传递,最终交由Activity#onTouchEvent处理.
6.onInterceptTouchEvent为ViewGroup特有,可以拦截事件.
7.Down事件到来时,如果一个View没有消费该事件,那么后续的MOVE/UP事件都不会再给它

7.简述一下RecyclerView缓存机制?

RecyclerView在Android的应用上可以说已经取代了listview,其灵活,组装式设置,多缓存机制可以适应多列表在Android开发中各种各样的需求。
对于RecyclerView的缓存机制一直都想稍微的屡下思路,简单点说RecyclerView对比listview缓存机制中就是多了两层缓存的支持,listview是两级缓存,RecyclerView为四级缓存(当然在大部分情况下是三级缓存)。

8.在一个listview里每个item中都有一个动画(gif)播放的view,当我点击item中的button时动画(gif)播放。当有动画播放时滑动listview,偶尔会发生item错位的事件。原因是什么?

这是item复用的问题,由于异步加载导致图片错位

9.Android多线程的实现方式有哪些?
Thread & AsyncTask
Thread 可以与Loop 和 Handler 共用建立消息处理队列
AsyncTask 可以作为线程池并行处理多任务

10.Android开发中何时使用多进程?使用多进程的好处是什么?
要想知道如何使用多进程,先要知道Android里的多进程概念。一般情况下,一个应用程序就是一个进程,这个进程名称就是应用程序包名。我们知道进程是系统分配资源和调度的基本单位,所以每个进程都有自己独立的资源和内存空间,别的进程是不能任意访问其他进程的内存和资源的。
那如何让自己的应用拥有多个进程?

很简单,我们的四大组件在AndroidManifest文件中注册的时候,有个属性是android:process,

1.这里可以指定组件的所处的进程。默认就是应用的主进程。指定为别的进程之后,系统在启动这个组件的时候,就先创建(如果还没创建的话)这个进程,然后再创建该组件。你可以重载Application类的onCreate方法,打印出它的进程名称,就可以清楚的看见了。再设置android:process属性时候,有个地方需要注意:如果是android:process=”:deamon”,以:开头的名字,则表示这是一个应用程序的私有进程,否则它是一个全局进程。私有进程的进程名称是会在冒号前自动加上包名,而全局进程则不会。一般我们都是有私有进程,很少使用全局进程。他们的具体区别不知道有没有谁能补充一下。

2.使用多进程显而易见的好处就是分担主进程的内存压力。我们的应用越做越大,内存越来越多,将一些独立的组件放到不同的进程,它就不占用主进程的内存空间了。当然还有其他好处,有心人会发现Android后台进程里有很多应用是多个进程的,因为它们要常驻后台,特别是即时通讯或者社交应用,不过现在多进程已经被用烂了。典型用法是在启动一个不可见的轻量级私有进程,在后台收发消息,或者做一些耗时的事情,或者开机启动这个进程,然后做监听等。还有就是防止主进程被杀守护进程,守护进程和主进程之间相互监视,有一方被杀就重新启动它。应该还有还有其他好处,这里就不多说了。

3.坏处的话,多占用了系统的空间,大家都这么用的话系统内存很容易占满而导致卡顿。消耗用户的电量。应用程序架构会变复杂,应为要处理多进程之间的通信。这里又是另外一个问题了。

11.Android下解决滑动冲突的常见思路是什么?
相关的滑动组件 重写onInterceptTouchEvent,然后判断根据xy值,来决定是否要拦截当前操作

12.如何把一个应用设置为系统应用?
成为系统应用,首先要在 对应设备的 Android 源码 SDK 下编译,编译好之后:
此 Android 设备是 Debug 版本,并且已经 root,直接将此 apk 用 adb 工具 push 到 system/app 或 system/priv-app 下即可。
如果非 root 设备,需要编译后重新烧写设备镜像即可。

有些权限(如 WRITE_SECURE_SETTINGS ),是不开放给第三方应用的,只能在对应设备源码中编译然后作为系统 app 使用。

13.Android内存泄露研究
Android内存泄漏指的是进程中某些对象(垃圾对象)已经没有使用价值了,但是它们却可以直接或间接地引用到gc roots导致无法被GC回收。无用的对象占据着内存空间,使得实际可使用内存变小,形象地说法就是内存泄漏了。
场景
类的静态变量持有大数据对象
静态变量长期维持到大数据对象的引用,阻止垃圾回收。
非静态内部类的静态实例
非静态内部类会维持一个到外部类实例的引用,如果非静态内部类的实例是静态的,就会间接长期维持着外部类的引用,阻止被回收掉。
资源对象未关闭
资源性对象如Cursor、File、Socket,应该在使用后及时关闭。未在finally中关闭,会导致异常情况下资源对象未被释放的隐患。
注册对象未反注册
未反注册会导致观察者列表里维持着对象的引用,阻止垃圾回收。

Handler临时性内存泄露
Handler通过发送Message与主线程交互,Message发出之后是存储在MessageQueue中的,有些Message也不是马上就被处理的。

在Message中存在一个 target,是Handler的一个引用,如果Message在Queue中存在的时间越长,就会导致Handler无法被回收。如果Handler是非静态的,则会导致Activity或者Service不会被回收。

由于AsyncTask内部也是Handler机制,同样存在内存泄漏的风险。
此种内存泄露,一般是临时性的。

最后

我平时经常看如下不错的公众号的技术文章,他们经常写一些面试经验、面试题解,也整理了很多免费的系列资料和学习资料,他们踏实而不浮躁、不贩卖焦虑。希望大家一起进步,时刻准备着。

2023年最新的Android面试大厂必考174题 (附详细答案)

每逢招聘旺季,都是程序员跳槽涨薪的好时机,金三银四没赶上,即将到来的金九银十可不能再错过了。获得想要获得更多机会,让你的人生更上一步台阶,就要充分准备。对于Android开发者而言,掌握一定的复习方法和面试技巧会让你的复习事半功倍,也能极大地提高通过前两轮技术面试的几率。

以下这份最新版《Android面试大厂必考174题 》包含各个大厂的高频面题及行业最新技术,是由阿里P6的大佬花两月时间整理和完善而出,资料内容全面、结构清晰,非常适合想要求职/跳槽的伙伴!!

内容概要:内涵字节跳动、小米、oppo、美团、阿里巴巴、腾讯、360、华为、京东等一线互联网公司面试技术真题。

参考解析:字节跳动技术团队、郭霖、鸿洋、玉刚、掘金博主 xiangzhihong、Focusing、simpleeeeee、DevYK、简书博主 huangLearn、腾讯享学课堂、慕课网、极客时间…

由于文章内容比较多,篇幅有限,资料已经被整理成了PDF文档,有需要《Android面试大厂必考174题》完整文档的可以加微信 即可免费领取!

Android面试大厂必考174题

纲要

1. SD卡

2. android的数据存储方式

3. BroadcastReceiver

4. sp频繁操作会有什么后果?sp能存多少数据?

5. dvm与jvm的区别

6. ART

7. Activity的生命周期

8. Application能不能启动Activity

9. Activity的状态都有哪些

10. 横竖屏切换时Activity的生命周期****Activity的状态都有哪些

11. 如何设置activity成窗口样式

12. Activity的启动方式

13. Service的生命周期

14. IntentService

15. Fragment和Activity的onCreateOptionsMenu

16. Service的onStartCommand有几种返回值

17. Service的onRebind什么情况下执行

18. Handler防止内存泄露

19. IntentFilter的匹配法则

20. Fragment与Activity传值

21. Fragment 生命周期

22. Fragment的add和replace的区别 //replace==remove|append

23. Fragment如何实现Activity栈的压栈和出栈

24. 什么情况下造成内存泄露

25. 图片过大导致OOM

26. SoftReference跟WeakRefrence的区别

27. dp与px

28. 设置布局为一半宽、高

29. 多分辨率支持的清单文件配置

30. Android的事件分发机制

31. ArrayList和LinkedList的区别

32. LruCache

33. 什么是ANR,如何规避

34. 描述Service的启动方式

35. Android有哪几种布局

36. HashMap、HashTable的区别 //从线程安全性、速度

37. 红黑树

38. Handler Looper 工作原理

39. Listview的几种adapter介绍

40. 如何在ListView间添加分割线

41. LinkedHashMap 源码解读

42. Drawable转Bitmap

43. Layout_weight

44. android:layout_gravity和android:gravity的区别

45. 如何重用布局

46. 使用merge减少include布局所造成的布局层次

47. 如何优化布局

48. android:layout_gravity的使用规则

49. TextView显示图像

50. SpannableString的使用

51. AutoCompleteTextView的使用

52. 在按钮上显示图像的方式有哪些

53. 如何动态改变Button的大小和位置

54. 如何让一个显示图像的按钮在不同状态下显示不同图像

55. 如何实现图像的半透明度

56. HttpURLConnection

57. ProgressBar

58. AbsListView

59. ListView,如何进行数据的增删改查

60. ListView中如何显示数据库中的数据

61. android TypedArray

62. 如何动态加载apk文件(未安装)的类

63. Android ContentProvider

64. 如何设置Activity为程序启动的默认Activity

65. 启动Activity的几种方式

66. Activity传递数据的方式

67. 如何将Activity设置成半透明的模态框

68. 如何接收广播

69. 如何获取短信内容

70. 如何拦截手机屏幕休眠和唤醒

71. 如何发送广播

72. AIDL与Service

73. 如何读取联系人信息

74. 请描述Content Provider的uri由哪几部分组成

75. 介绍开发ContentProvider的步骤

76. 如何为ContentProvider添加访问权限

77. AlertDialog

78. 如何自己控制对话框的关闭时机

79. 如何改变对话框的透明度

80. 如何自己控制Toast的显示和关闭

81. 如何使用Notification

82. PendingIntent使用 //跨进程intent

83. 点击Notification触发Activity跳转

84. 如何自定义Notification的view

85. 然后为一个Activity添加选项菜单

86. 如何将上下文菜单绑定至可视组件View

87. 在单击菜单时,如何能跳转进别的Activity

88. 菜单的回调函数有哪些

89. 如何使用SharedPreferences存取数据

90. SharedPreferences //构造函数(string name,int mode)

91. Android如何解析xml文件

92. gson

93. 如何将table1表的数据和结构复制到table2上

94. SQLite

95. SQLiteOpenHelper.getReadableDatabase和SQLiteOpenHelper.getWritableDatabase将数据库文件放哪了

96. 然后将带数据的SQLite同apk一起发布

97. Socket连接成功后,怎么获取服务器的ip和域名

98. BufferedInputStream mark //只有BufferedInputStream实现了mark方法

99. 如何打开手机中的蓝牙功能

100. 如何获取已绑定的蓝牙设备

101. 搜索蓝牙的过程中经过哪些状态

102. 隐式Intent

103. 如何采用广播监听去电和来电

104. Android支持的电话状态

105. Android如何控制接听和挂断电话

106. 请给出访问通话记录的Content Provider URI

107. 发送短信 //需要动态请求权限:android.permission.SEND_SMS

108. ContactsContract

109. VideoView 播放视频

110. 在工程路径下的res/drawable存放tree.png,如果将图片显示在View上

111. 调用Drawable进行绘图

112. 如何设置图像透明度

113. 如何旋转View

114. Activity 切换

115. Android

116. 动画

117. 属性动画 Animator

118. 定义字符串数组资源

119. 图层layer资源

120. Clip图像资源

121. ShapeDrawable

122. 如何统一设置多个View的android:textSize和android:textColor

123. 属性动画 Animator****123布局文件中的”@“、”+”、”?”含义

124. Android获取屏幕高度和宽度的办法

125. AsyncTask

126. Intent可传递的数据类型

127. AlarmManager //闹钟

128. HandlerThread

129. 自定义ViewGroup

130. JVM的GC算法

131. OkHttp

132. ButterKnife //源码阅读

133. Dalvik内存模型

134. ART垃圾回收

135. JVM 可达性分析中哪些对象可以作为根节点

136. HashSet

137. SSL中的对称加密和非对称加密

138. Handler的内存泄露问题

139. Android volatile关键字

140. EventBus 源码阅读 //反射Class通常采用通配符 =>Class<?>或者Class<? extends T>

141. String a=“ abc”;String b=“ abc”; 创建了几个对象 //栈存放引用变量 堆存在new出来的对象,并且堆划分出一部分作为常量池

142. java的单例创建

143. Android进程优先级

144. ThreadLocal 源码

145. 自定义View对象

146. Android @Override //重写

147. Android Semaphore机制

148. Android Lock同步

149. ThreadPoolExecutor 线程池

150. Android下载图片通过bitmap设置ImageView

151. ImageView

152. onSaveInstanceState //保存app数据,当系统因内存不足时而销毁app,会得到调用

153. ViewPager&PagerAdapter&TabFragmentPagerAdapter

154. Fragment在横竖屏切换时的数据保存

155. DialogFragment //采用子类继承的方式进行使用,相比AlertDialog由FragmentManager负责自动重建

156. SQLiteDatabase

157. IntentFilter的匹配规则

158. Android多进程

159. Android Scroller

160. Sqlite 连接操作

161. Spinner

162. RelativeLayout 源代码

163. Message //static Message sPool,指向队列前头的可用Message对象

164. ArrayDeque 源代码阅读

165. RecyclerView

166. LinearLayoutManager //RecyclerView的布局管理器

167. GridLayoutManager

168. RecyclerView 使用

169. Binder

170. ActivityThread //Android应用的主线程

171. CountDownLatch 线程同步

172. retrofit

173. ClassLoader 类加载器

174. RxJava

由于文章内容比较多,篇幅有限,资料已经被整理成了PDF文档,有需要《Android面试大厂必考174题》完整文档的可以加微信 即可免费领取!

有关2023 Android面试官 常问的问题以及答案(附最新的Android面试大厂必考174题 )的更多相关文章

  1. ruby - 什么是填充的 Base64 编码字符串以及如何在 ruby​​ 中生成它们? - 2

    我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%

  2. 华为OD机试用Python实现 -【明明的随机数】 2023Q1A - 2

    华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o

  3. 【鸿蒙应用开发系列】- 获取系统设备信息以及版本API兼容调用方式 - 2

    在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList​()Obt

  4. 【Java 面试合集】HashMap中为什么引入红黑树,而不是AVL树呢 - 2

    HashMap中为什么引入红黑树,而不是AVL树呢1.概述开始学习这个知识点之前我们需要知道,在JDK1.8以及之前,针对HashMap有什么不同。JDK1.7的时候,HashMap的底层实现是数组+链表JDK1.8的时候,HashMap的底层实现是数组+链表+红黑树我们要思考一个问题,为什么要从链表转为红黑树呢。首先先让我们了解下链表有什么不好???2.链表上述的截图其实就是链表的结构,我们来看下链表的增删改查的时间复杂度增:因为链表不是线性结构,所以每次添加的时候,只需要移动一个节点,所以可以理解为复杂度是N(1)删:算法时间复杂度跟增保持一致查:既然是非线性结构,所以查询某一个节点的时候

  5. 阿里云国际版免费试用:如何注册以及注意事项 - 2

    作为新的阿里云用户,您可以50免费试用多种优惠,价值高达1,700美元(或8,500美元)。这将让您了解和体验阿里云平台上提供的一系列产品和服务。如果您以个人身份注册免费试用,您将获得价值1,700美元的优惠。但是,如果您是注册公司,您可以选择企业免费试用,提交基本信息通过企业实名注册验证,即可开始价值$8,500的免费试用!本教程介绍了如何设置您的帐户并使用您的免费试用版。​关于免费试用在我们开始此试用之前,您还必须遵守以下条款和条件才能访问您的免费试用:只有在一年内创建的账户才有资格获得阿里云免费试用。通过此免费试用优惠,用户可以免费试用免费试用活动页面上列出的每种产品一次。如果您有多个帐

  6. 安卓apk修改(Android反编译apk) - 2

    最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路

  7. ruby - ruby 中的同一个程序如何接受来自用户的输入以及命令行参数 - 2

    我的ruby​​脚本从命令行参数获取某些输入。它检查是否缺少任何命令行参数,然后提示用户输入。但是我无法使用gets从用户那里获得输入。示例代码:test.rbname=""ARGV.eachdo|a|ifa.include?('-n')name=aputs"Argument:#{a}"endendifname==""puts"entername:"name=getsputsnameend运行脚本:rubytest.rbraghav-k错误结果:test.rb:6:in`gets':Nosuchfileordirectory-raghav-k(Errno::ENOENT)fromtes

  8. 华为OD机试真题 C++ 实现【带传送阵的矩阵游离】【2023 Q2 | 200分】 - 2

            所有题目均有五种语言实现。C实现目录、C++实现目录、Python实现目录、Java实现目录、JavaScript实现目录题目n行m列的矩阵,每个位置上有一个元素你可以上下左右行走,代价是前后两个位置元素值差的绝对值.另外,你最多可以使用一次传送阵(只能从一个数跳到另外一个相同的数)求从走上角走到右下角最少需要多少时间。输入描述:第一行两个整数n,m,分别代表矩阵的行和列。后面n行,每行m个整数,分别代表矩阵中的元素。输出描述:一个整数,表示最少需要多少时间。

  9. 西安华为OD面试体验 - 2

    西安华为OD面试体验开始投简历技术面试进展工作进展开始投简历去年一整年一直在考研和工作之间纠结,感觉自己的状态好像当时的疫情一样差劲。之前刚毕业的时候投了个大厂的简历,结果一面写算法的时候太拉跨了,虽然知道时dfs但是代码熟练度不够,放在平时给足时间自己可以调试通过,但是熟练度不够那面试当时就写不出来被刷了。说真的算法学到后期我感觉最重要的是熟练度和背板子(对于我这种普通玩家来说),面试题如果一上来短时间内想不出思路就完蛋了。然后由于当时找的工作不是很理想就又想考研了。但是考研是有风险的,我自我感觉自己可能冲不上那个学校,而找工作一个没成可以继续找嘛。本着抱着试试看的态度在boss上投了简历,

  10. IDEA 2023.1 正式发布,新特性简介 - 2

     昨晚看到IDEA官推宣布IntelliJIDEA2023.1正式发布了。简单看了一下,发现这次的新版本包含了许多改进,进一步优化了用户体验,提高了便捷性。至于是否升级最新版本完全是个人意愿,如果觉得新版本没有让自己感兴趣的改进,完全就不用升级,影响不大。软件的版本迭代非常正常,正确看待即可,不持续改进就会慢慢被淘汰!根据官方介绍:IntelliJIDEA2023.1针对新的用户界面进行了大量重构,这些改进都是基于收到的宝贵反馈而实现的。官方还实施了性能增强措施,使得Maven导入更快,并且在打开项目时IDE功能更早地可用。由于后台提交检查,新版本提供了简化的提交流程。IntelliJIDEA

随机推荐