字节跳动正式启动2024届秋季校招!这份字节跳动历年校招Android面试真题解析,你确定不收藏?(上)(2)

前言

近日,字节跳动正式启动了2021届秋季校园招聘,为应届毕业生开放超过6000个工作岗位。这一数字超过了该公司往年秋招规模,并与其今年春招规模持平。全年校招人数共计超过1万2千人,远高于同类型互联网公司,体现了字节跳动保持业务快速增长,重视对优秀人才的持续投入。

字节跳动校园招聘负责人介绍,该项招聘主要面向2021届毕业生,即2020 年9月至2021年8月期间毕业的大学生群体。这批岗位覆盖字节跳动10多项产品和业务,既包括今日头条、抖音、西瓜视频等旗舰产品,也包括懂车帝、幸福里、番茄小说等垂类应用,以及清北网校、瓜瓜龙、飞书等新兴业务。具体职位包含研发、产品、运营、设计、市场、销售等多种类别,涉及北京、上海、深圳、杭州、成都、广州、武汉、南京等多座城市。

据了解,本次秋招将持续三个月,从8月初至10月31日结束,相关岗位招聘信息可在字节跳动校园招聘官网(https://job.bytedance.com/campus/)查询。今年,为帮助广大应届毕业生获取心仪岗位、提升入职几率,字节跳动还首次面向应届毕业生开放2次投递机会,应聘者可以选择一次性投递2个岗位,也可以分2次各投递1个岗位。(李锐)

前言来自光明网:字节跳动持续大规模招聘,全年校招超过1万人

正文

本篇将针对字节跳动2020秋季Android校园招聘,对字节跳动2017-2020历年的校招Android岗面试真题,做一个详细的整理及解析。希望对大家有所帮助,喜欢的小伙伴别忘了点个赞哦。

更多腾讯、阿里、百度面试真题系列文章已上传GitHub
B站全套Android移动架构师进阶视频教程白嫖地址:https://space.bilibili.com/544650554

由于篇幅过长,共分为三篇文章讲解。


1.面试题解

1.1 Android

Q:说下Activity的生命周期?

  • 技术点:Activity生命周期
  • 思路:分条解释Activity从创建到销毁整个生命周期中涉及到的方法及作用
  • 参考回答:在Activity的生命周期涉及到七大方法,分别是:
    • onCreate()表示Activity 正在创建,常做初始化工作,如setContentView界面资源、初始化数据
    • onStart()表示Activity 正在启动,这时Activity 可见但不在前台,无法和用户交互
    • onResume()表示Activity 获得焦点,此时Activity 可见且在前台并开始活动
    • onPause()表示Activity 正在停止,可做 数据存储、停止动画等操作
    • onStop()表示activity 即将停止,可做稍微重量级回收工作,如取消网络连接、注销广播接收器等
    • onDestroy()表示Activity 即将销毁,常做回收工作、资源释放
    • 另外,当Activity由后台切换到前台,由不可见到可见时会调用onRestart(),表示Activity 重新启动

Q:onStart()和onResume()/onPause()和onStop()的区别?

  • 技术点:Activity生命周期
  • 思路:可从使用细节出发
  • 参考回答:onStart()与onStop()是从Activity是否可见这个角度调用的,onResume()和onPause()是从Activity是否显示在前台这个角度来回调的,在实际使用没其他明显区别。

Q:Activity A启动另一个Activity B会回调哪些方法?如果Activity B是完全透明呢?如果启动的是一个对话框Activity呢?

  • 技术点:Activity生命周期
  • 参考回答:Activity A启动另一个Activity B会回调的方法:Activity A的onPause() -->Activity B的onCreate()–>onStart()–>onResume()–>Activity A的onStop();如果Activity B是完全透明的,则最后不会调用Activity A的onStop();如果是对话框Activity,同后种情况。

Q:谈谈onSaveInstanceState()方法?何时会调用?

  • 技术点:Activity重建
  • 思路:可从使用场景、调用次序上解释
  • 参考回答:当非人为终止Activity时,比如系统配置发生改变时导致Activity被杀死并重新创建、资源内存不足导致低优先级的Activity被杀死,会调用 onSavaInstanceState() 来保存状态。该方法调用在onStop之前,但和onPause没有时序关系。
  • 引申:可再谈谈它和onRestoreInstanceState()的关系以及后者的作用

Q:onSaveInstanceState()与onPause()的区别?

  • 技术点:Activity重建
  • 思路:可从适用场景出发
  • 参考回答:onSaveInstanceState()适用于对临时性状态的保存,而onPause()适用于对数据的持久化保存。

Q:如何避免配置改变时Activity重建?

  • 技术点:Activity重建
  • 思路:一种解决思路是设置配置文件中Activity的configChanges属性
  • 参考回答:为了避免由于配置改变导致Activity重建,可在AndroidManifest.xml中对应的Activity中设置android:configChanges=“orientation|screenSize”。此时再次旋转屏幕时,该Activity不会被系统杀死和重建,只会调用onConfigurationChanged。因此,当配置程序需要响应配置改变,指定configChanges属性,重写onConfigurationChanged方法即可。

Q:优先级低的Activity在内存不足被回收后怎样做可以恢复到销毁前状态?

  • 技术点:Activity重建
  • 思路:可从Activity重建会被调用的方法出发
  • 参考回答:优先级低的Activity在内存不足被回收后重新打开会引发Activity重建。Activity被重新创建时会调用onRestoreInstanceState(该方法在onStart之后),并将onSavaInstanceState保存的Bundle对象作为参数传到onRestoreInstanceState与onCreate方法。因此可通过onRestoreInstanceState(Bundle savedInstanceState)和onCreate((Bundle savedInstanceState)来判断Activity是否被重建,并取出数据进行恢复。但需要注意的是,在onCreate取出数据时一定要先判断savedInstanceState是否为空。另外,谷歌更推荐使用onRestoreInstanceState进行数据恢复。

Q:说下Activity的四种启动模式?(有时会出个实际问题来分析返回栈中Activity的情况)

  • 技术点:Activity启动模式
  • 思路:分条解释四个启动模式的特点
  • 参考回答:
    • standard标准模式:每次启动一个Activity就会创建一个新的实例
    • singleTop栈顶复用模式:如果新Activity已经位于任务栈的栈顶,就不会重新创建,并回调 onNewIntent(intent) 方法
    • singleTask栈内复用模式:只要该Activity在一个任务栈中存在,都不会重新创建,并回调 onNewIntent(intent) 方法。如果不存在,系统会先寻找是否存在需要的栈,如果不存在该栈,就创建一个任务栈,并把该Activity放进去;如果存在,就会创建到已经存在的栈中
    • singleInstance单实例模式:具有此模式的Activity只能单独位于一个任务栈中,且此任务栈中只有唯一一个实例

Q:谈谈singleTop和singleTask的区别以及应用场景

  • 技术点:Activity启动模式
  • 思路:可先解释两个启动模式的含义(见上一个问题),再总结不同点,最后给出应用实例
  • 参考回答:singleTop和singleTask的含义分别是…,可见两者大致区别有:
    • singleTop:同个Activity实例在栈中可以有多个,即可能重复创建;该模式的Activity会默认进入启动它所属的任务栈,即不会引起任务栈的变更;为防止快速点击时多次startActivity,可以将目标Activity设置为singleTop
    • singleTask:同个Activity实例在栈中只有一个,即不存在重复创建;可通过android:taskAffinity设定该Activity需要的任务栈,即可能会引起任务栈的变更;常用于主页和登陆页

Q:onNewIntent()调用时机?

  • 技术点:Activity启动模式
  • 参考回答:启动模式为singleTop或singleTask的Activity在以下情况会回调onNewIntent():
    • singleTop:如果新Activity已经位于任务栈的栈顶,就不会重新创建,并回调 onNewIntent(intent) 方法
    • singleTask:只要该Activity在一个任务栈中存在,都不会重新创建,并回调 onNewIntent(intent) 方法

Q:了解哪些Activity启动模式的标记位?

  • 技术点:Activity启动模式
  • 参考回答:常见的两个标记为:
    • FLAG_ACTIVITY_SINGLE_TOP:对应singleTop启动模式
    • FLAG_ACTIVITY_NEW_TASK :对应singleTask模式
  • 引申:可再谈谈singleTop和singleTask具体效果

Q:如何启动其他应用的Activity?

  • 技术点:Activity启动、IntentFilter匹配
  • 思路:可从隐式Intent角度出发
  • 参考回答:在保证有权限访问的情况下,通过隐式Intent进行目标Activity的IntentFilter匹配,原则是:
    • 一个intent只有同时匹配某个Activity的intent-filter中的action、category、data才算完全匹配,才能启动该Activity。
    • 一个Activity可以有多个 intent-filter,一个 intent只要成功匹配任意一组 intent-filter,就可以启动该Activity。
  • 引申:如有必要可展开说明action、category、data的具体匹配规则

Q:Activity的启动过程?

  • 技术点:Activity启动、ActivityManagerServie、ApplicationThread
  • 思路:可大致介绍Activity启动过程涉及到的类,尤其是ActivityManagerServie、ApplicationThread从中发挥的作用。详见要点提炼|开发艺术之四大组件
  • 参考回答:调用startActivity()后经过重重方法会转移到ActivityManagerService的startActivity(),并通过一个IPC回到ActivityThread的内部类ApplicationThread中,并调用其scheduleLaunchActivity()将启动Activity的消息发送并交由Handler H处理。Handler H对消息的处理会调用handleLaunchActivity()->performLaunchActivity()得以完成Activity对象的创建和启动。
  • 引申:由于ActivityManagerService是一个Binder对象,可引申谈谈Binder机制

Q:谈一谈Fragment的生命周期?

  • 技术点:Fragment生命周期
  • 思路:分条解释Fragment从创建到销毁整个生命周期中涉及到的方法及作用
  • 参考回答:Fragment从创建到销毁整个生命周期中涉及到的方法依次为:onAttach()->onCreate()-> onCreateView()->onActivityCreated()->onStart()->onResume()->onPause()->onStop()->onDestroyView()->onDestroy()->onDetach(),其中和Activity有不少名称相同作用相似的方法,而不同的方法有:
    • onAttach():当Fragment和Activity建立关联时调用
    • onCreateView():当Fragment创建视图时调用
    • onActivityCreated():当与Fragment相关联的Activity完成onCreate()之后调用
    • onDestroyView():在Fragment中的布局被移除时调用
    • onDetach():当Fragment和Activity解除关联时调用

Q:Activity和Fragment的异同?

  • 技术点:Fragment作用
  • 思路:分别解释“异”“同”
  • 参考回答:
    • Activity和Fragment的相似点在于,它们都可包含布局、可有自己的生命周期,Fragment可看似迷你活动。
    • 不同点是,由于Fragment是依附在Activity上的,多了些和宿主Activity相关的生命周期方法,如onAttach()、onActivityCreated()、onDetach();另外,Fragment的生命周期方法是由宿主Activity而不是操作系统调用的,Activity中生命周期方法都是protected,而Fragment都是public,也能印证了这一点,因为Activity需要调用Fragment那些方法并管理它。
  • 引申:可具体谈谈Activity和Fragment的关系

Q:Activity和Fragment的关系?

  • 技术点:Fragment作用
  • 思路:可从Fragment出现的目的、两者数量关系、调用关系展开
  • 参考回答:
    • 正如Fragment的名字“碎片”,它的出现是为了解决Android碎片化 ,它可作为Activity界面的组成部分,可在Activity运行中实现动态地加入、移除和交换。
    • 一个Activity中可同时出现多个Fragment,一个Fragment也可在多个Activity中使用。
    • 另外,Activity的FragmentManager负责调用队列中Fragment的生命周期方法,只要Fragment的状态与Activity的状态保持了同步,宿主Activity的FragmentManager便会继续调用其他生命周期方法以继续保持Fragment与Activity的状态一致。

Q:何时会考虑使用Fragment?

  • 技术点:Fragment作用
  • 思路:列举更适合使用Fragment的情况
  • 参考回答:非常经典的例子,即用两个Fragment封装两个界面模块,这样只使一套代码就能适配两种设备,达到两种界面效果;单一场景切换时使用Fragment更轻量化,如ViewPager和Fragment搭配使用

Q:谈一谈Service的生命周期?

  • 技术点:Service生命周期
  • 思路:分条解释Service从创建到销毁整个生命周期中涉及到的方法及作用
  • 参考回答:在Service的生命周期涉及到六大方法,分别是:
    • onCreate():服务第一次被创建时调用
    • onStartComand():服务启动时调用
    • onBind():服务被绑定时调用
    • onUnBind():服务被解绑时调用
    • onDestroy():服务停止时调用
  • 引申:谈谈相对应的两种启动方式

Q:Service的两种启动方式?区别在哪?

  • 技术点:Service生命周期
  • 思路:分别解释两种启动模式如何启动和停止Service,并引起生命周期怎样的变化
  • 参考回答:
    • 第一种,其他组件调用Context的 startService() 方法可以启动一个Service,并回调服务中的onStartCommand()。如果该服务之前还没创建,那么回调的顺序是onCreate()->onStartCommand()。服务启动了之后会一直保持运行状态,直到 stopService()stopSelf() 方法被调用,服务停止并回调onDestroy()。另外,无论调用多少次startService()方法,只需调用一次stopService()或stopSelf()方法,服务就会停止了。
    • 第二种,其它组件调用Context的 bindService() 可以绑定一个Service,并回调服务中的onBind()方法。类似地,如果该服务之前还没创建,那么回调的顺序是onCreate()->onBind()。之后,调用方可以获取到onBind()方法里返回的IBinder对象的实例,从而实现和服务进行通信。只要调用方和服务之间的连接没有断开,服务就会一直保持运行状态,直到调用了 unbindService() 方法服务会停止,回调顺序onUnBind()->onDestroy()。

Q:一个Activty先start一个Service后,再bind时会回调什么方法?此时如何做才能回调Service的destory()方法?

  • 技术点:Service生命周期
  • 参考回答:startService()启动Service之后,再bindService()绑定,此时只会回调onBind()方法;若想回调Service的destory()方法,需要同时调用 stopService()和 unbindService()方法才能让服务销毁掉。

Q:Service如何和Activity进行通信?

  • 技术点:Service信息传递
  • 思路:简单介绍Service如何和Activity双向通信的流程
  • 参考回答:通过bindService()可以实现Activity调用Service中的方法,具体步骤见学习笔记| AS入门(十) 组件篇之Service; 通过广播实现Service向Activity发送消息
  • 引申:谈谈底层的Binder机制

Q:用过哪些系统Service?

  • 技术点:Service类型(系统Service)
  • 参考回答:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Q:是否能在Service进行耗时操作?如果非要可以怎么做?

  • 技术点:Service使用注意
  • 参考回答:Service默认并不会运行在子线程中,也不运行在一个独立的进程中,它同样执行在主线程中(UI线程)。换句话说,不要在Service里执行耗时操作,除非手动打开一个子线程,否则有可能出现主线程被阻塞(ANR)的情况。
  • 引申:可以引申谈谈开子线程的几种方法

Q:AlarmManager能实现定时的原理?

  • 技术点:系统服务(后台定时)
  • 思路:AlarmManager
  • 参考回答:通过调用AlarmManager的 set() 方法就可以设置一个定时任务,并提供三个参数(工作类型,定时任务触发的时间,PendingIntent对象)。其中第三个PendingIntent对象是关键,一般会调用它的 getBroadcast() 方法来获取一个能够执行广播的PendingIntent。这样当定时任务被触发的时候,广播接收器的onReceive()方法就可以得到执行。即通过服务和广播的循环触发实现定时服务。
  • 引申:可谈谈底层定时机制实现原理

Q:前台服务是什么?和普通服务的不同?如何去开启一个前台服务?

  • 技术点:Service类型(前台Service)
  • 参考回答:和一般运行在后台的服务不同,前台服务的服务状态可以被用户一眼看到。它和普通服务最大的区别是,前者会一直有一个正在运行的图标在系统的状态栏显示,下拉状态栏后可以看到更加详细的信息,非常类似于通知的效果,且当系统内存不足服务被杀死时,通知会被移除。实现一个前台服务也非常简单,和发送一个通知非常类似,只不过在构建好一个Notification之后,不需要NotificationManager将通知显示出来,而是调用了 startForeground() 方法。

Q:是否了解ActivityManagerService,谈谈它发挥什么作用?

  • 技术点:Service类型(ActivityManagerService)
  • 思路:可谈谈在四大组件创建中ActivityManagerService发挥的作用,详见要点提炼|开发艺术之四大组件
  • 参考回答:ActivityManagerService是Android中最核心的服务 , 主要负责系统中四大组件的启动、切换、调度及应用进程的管理和调度等工作,其职责与操作系统中的进程管理和调度模块类似。
  • 引申:看源码谈谈AMS启动过程:ActivityManagerService分析——AMS启动流程

Q:如何保证Service不被杀死?

  • 技术点:Service应用
  • 思路:列举几种解决办法
  • 参考回答:可以采取以下几种解决方法:
    • 在Service的onStartCommand()中设置flages值为START_STICKY,使得Service被杀死后尝试再次启动Service
    • 提升Service优先级,比如设置为一个前台服务
    • 在Activity的onDestroy()通过发送广播,并在广播接收器的onReceive()中启动Service

Q:广播有几种形式?什么特点?

  • 技术点:Broadcast类型
  • 思路:分条解释每种广播类型的特点
  • 参考回答:常见以下四种广播:
    • 普通广播:一种完全异步执行的广播,在广播发出之后,所有的广播接收器几乎都会在同一时刻接收到这条广播消息,因此它们接收的先后是随机的。
    • 有序广播:一种同步执行的广播,在广播发出之后,同一时刻只会有一个广播接收器能够收到这条广播消息,当这个广播接收器中的逻辑执行完毕后,广播才会继续传递,所以此时的广播接收器是有先后顺序的,且优先级(priority)高的广播接收器会先收到广播消息。有序广播可以被接收器截断使得后面的接收器无法收到它。
    • 本地广播:发出的广播只能够在应用程序的内部进行传递,并且广播接收器也只能接收本应用程序发出的广播。
    • 粘性广播:这种广播会一直滞留,当有匹配该广播的接收器被注册后,该接收器就会收到此条广播。

Q:广播的两种注册形式?区别在哪?

  • 技术点:Broadcast使用
  • 参考回答:广播的注册有两种方法:一种在活动里通过代码动态注册,另一种在配置文件里静态注册。两种方式的相同点是都完成了对接收器以及它能接收的广播值这两个值的定义;不同点是动态注册的接收器必须要在程序启动之后才能接收到广播,而静态注册的接收器即便程序未启动也能接收到广播,比如想接收到手机开机完成后系统发出的广播就只能用静态注册了。

Q:ContentProvider了解多少?

  • 技术点:ContentProvider
  • 思路:ContentProvider功能
  • 参考回答:作为四大组件之一,ContentProvider主要负责存储和共享数据。与文件存储、SharedPreferences存储、SQLite数据库存储这几种数据存储方法不同的是,后者保存下的数据只能被该应用程序使用,而前者可以让不同应用程序之间进行数据共享,它还可以选择只对哪一部分数据进行共享,从而保证程序中的隐私数据不会有泄漏风险。
  • 引申:谈谈ContentProvider底层使用Binder机制原理

Q:Android中提供哪些数据持久存储的方法?

  • 技术点:数据持久化
  • 思路:分条解释每种数据持久存储的特点
  • 参考回答:Android平台实现数据存储的常见几种方式:
    • File 文件存储:写入和读取文件的方法和 Java中实现I/O的程序一样。
    • SharedPreferences存储:一种轻型的数据存储方式,常用来存储一些简单的配置信息,本质是基于XML文件存储key-value键值对数据。
    • SQLite数据库存储:一款轻量级的关系型数据库,它的运算速度非常快,占用资源很少,在存储大量复杂的关系型数据的时可以使用。
    • ContentProvider:四大组件之一,用于数据的存储和共享,不仅可以让不同应用程序之间进行数据共享,还可以选择只对哪一部分数据进行共享,可保证程序中的隐私数据不会有泄漏风险。

Q:Java中的I/O流读写怎么做?

  • 技术点:数据持久化(文件存储)
  • 思路:大致介绍核心类和核心方法
  • 参考回答:和 Java中实现I/O的程序是一样的,Context类中提供了openFileInput()和openFileOutput()方法来打开数据文件里的文件IO流,有关读写涉及的主要方法详见文章学习笔记| AS入门(七) 数据存储篇

Q:SharePreferences适用情形?使用中需要注意什么?

  • 技术点:数据持久化(SharePreferences存储)
  • 参考回答:SharePreferences是一种轻型的数据存储方式,适用于存储一些简单的配置信息,如int、string、boolean、float和long。由于系统对SharedPreferences的读/写有一定的缓存策略,即在内存中有一份该文件的缓存,因此在多进程模式下,其读/写会变得不可靠,甚至丢失数据。
  • 引申:谈谈Android中多进程通信(Binder)

Q:了解SQLite中的事务处理吗?是如何做的?

  • 技术点:数据持久化(SQLite)
  • 参考回答:SQLite在做CRDU操作时都默认开启了事务,然后把SQL语句翻译成对应的SQLiteStatement并调用其相应的CRUD方法,此时整个操作还是在rollback journal这个临时文件上进行,只有操作顺利完成才会更新.db数据库,否则会被回滚。
  • 引申:谈谈如何模仿SQLite中事务的思想更高效进行批量操作

Q:使用SQLite做批量操作有什么好的方法吗?

  • 技术点:数据持久化(SQLite)
  • 思路:模仿SQLite的事务处理
  • 参考回答:使用SQLiteDatabase的beginTransaction()方法开启一个事务,将批量操作SQL语句转化成SQLiteStatement并进行批量操作,结束后endTransaction()

Q:如果现在要删除SQLite中表的一个字段如何做?

  • 技术点:数据持久化(SQLite)
  • 参考回答:SQLite数据库只允许增加表字段而不允许修改和删除表字段,只能采取复制表思想,即创建一个新表保留原表想要的字段、再将原表删除

Q:使用SQLite时会有哪些优化操作?

  • 技术点:数据持久化(SQLite)
  • 思路:列举可优化点
  • 参考回答:
    • 使用事务做批量操作:具体操作见上
    • 及时关闭Cursor,避免内存泄漏
    • 耗时操作异步化:数据库的操作属于本地IO,通常比较耗时,建议将这些耗时操作放入异步线程中处理
    • ContentValues的容量调整:ContentValues内部采用HashMap来存储Key-Value数据,ContentValues初始容量为8,扩容时翻倍。因此建议对ContentValues填入的内容进行估量,设置合理的初始化容量,减少不必要的内部扩容操作
    • 使用索引加快检索速度:对于查询操作量级较大、业务对要求查询要求较高的推荐使用索引

Q:Android中进程和线程的关系?

  • 技术点:进程、线程
  • 参考回答:
    • 形象理解:如果把安卓系统比喻成一片土壤,可以把App看做扎根在这片土壤上的工厂,每个APP一般对应一个进程,那么线程就像是工厂的生产线。其中,主线程好比是主生产线,只有一条,子线程就像是副生产线,可以有很多条。
    • 关系:一个APP一般对应一个进程和有限个线程
      • 一般对应一个进程,当然,可以在AndroidMenifest中给四大组件指定属性android:process开启多进程模式
      • 有限个线程:线程是一种受限的系统资源,不可无限制的产生且线程的创建和销毁都有一定的开销。

Q:为何需要进行IPC?多进程通信可能会出现什么问题?

  • 技术点:多进程通信
  • 思路:讨论多进程通信会出现的问题得出IPC的必要性
  • 参考回答:
  • (1)多进程造成的影响可总结为以下四方面:
    • 静态变量和单例模式失效:由独立的虚拟机造成
    • 线程同步机制失效:由独立的虚拟机造成
    • SharedPreference的不可靠下降:不支持两个进程同时进行读写操作,即不支持并发读写,有一定几率导致数据丢失
    • Application多次创建: Android系统会为新的进程分配独立虚拟机,相当于系统又把这个应用重新启动了一次。
  • (2)需要进程间通信的必要性:所有运行在不同进程的四大组件,只要它们之间需要通过内存在共享数据,都会共享失败。这是由于Android为每个应用分配了独立的虚拟机,不同的虚拟机在内存分配上有不同的地址空间,这会导致在不同的虚拟机中访问同一个类的对象会产生多份副本。
  • 引申: 谈谈IPC的使用场景

Q:什么是序列化?Serializable接口和Parcelable接口的区别?为何推荐使用后者?

  • 技术点:序列化
  • 参考回答:序列化表示将一个对象转换成可存储或可传输的状态。序列化后的对象可以在网络上进行传输,也可以存储到本地。
    • 应用场景:需要通过Intent和Binder等传输类对象就必须完成对象的序列化过程。
    • 两种方式:实现Serializable/Parcelable接口。不同点如图:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Q:Android中为何新增Binder来作为主要的IPC方式?

  • 技术点:Binder机制
  • 思路:回答Binder优点
  • 参考回答:Binder机制有什么几条优点
    • 传输效率高、可操作性强:传输效率主要影响因素是内存拷贝的次数,拷贝次数越少,传输速率越高。从Android进程架构角度分析:对于消息队列、Socket和管道来说,数据先从发送方的缓存区拷贝到内核开辟的缓存区中,再从内核缓存区拷贝到接收方的缓存区,一共两次拷贝,如图:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

而对于Binder来说,数据从发送方的缓存区拷贝到内核的缓存区,而接收方的缓存区与内核的缓存区是映射到同一块物理地址的,节省了一次数据拷贝的过程,如图:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

由于共享内存操作复杂,综合来看,Binder的传输效率是最好的。

  • 实现C/S架构方便:Linux的众IPC方式除了Socket以外都不是基于C/S架构,而Socket主要用于网络间的通信且传输效率较低。Binder基于C/S架构 ,Server端与Client端相对独立,稳定性较好。
  • 安全性高:传统Linux IPC的接收方无法获得对方进程可靠的UID/PID,从而无法鉴别对方身份;而Binder机制为每个进程分配了UID/PID且在Binder通信时会根据UID/PID进行有效性检测。

Q:使用Binder进行数据传输的具体过程?

  • 技术点:Binder机制
  • 思路:通过AIDL实现方式解释Binder数据传输的具体过程
  • 参考回答:服务端中的Service给与其绑定的客户端提供Binder对象,客户端通过AIDL接口中的asInterface()将这个Binder对象转换为代理Proxy,并通过它发起RPC请求。客户端发起请求时会挂起当前线程,并将参数写入data然后调用transact(),RPC请求会通过系统底层封装后由服务端的onTransact()处理,并将结果写入reply,最后返回调用结果并唤醒客户端线程。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Q:Binder框架中ServiceManager的作用?

  • 技术点:Binder机制
  • 思路:从Binder框架出发讨论每个元素的作用
  • 参考回答:在Binder框架定义了四个角色:Server,Client,ServiceManager和Binder驱动。其中Server、Client、ServiceManager运行于用户空间,Binder驱动运行于内核空间。关系如图:

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

最后

其实Android开发的知识点就那么多,面试问来问去还是那么点东西。所以面试没有其他的诀窍,只看你对这些知识点准备的充分程度。so,出去面试时先看看自己复习到了哪个阶段就好。

下图是我进阶学习所积累的历年腾讯、头条、阿里、美团、字节跳动等公司2019-2021年的高频面试题,博主还把这些技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

整理不易,望各位看官老爷点个关注转发,谢谢!祝大家都能得到自己心仪工作。

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
(img-LwKYzKwH-1712983770416)]

最后

其实Android开发的知识点就那么多,面试问来问去还是那么点东西。所以面试没有其他的诀窍,只看你对这些知识点准备的充分程度。so,出去面试时先看看自己复习到了哪个阶段就好。

下图是我进阶学习所积累的历年腾讯、头条、阿里、美团、字节跳动等公司2019-2021年的高频面试题,博主还把这些技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节

[外链图片转存中…(img-7cxe93zI-1712983770416)]

整理不易,望各位看官老爷点个关注转发,谢谢!祝大家都能得到自己心仪工作。

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-n8wY5MTJ-1712983770416)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值