前几年移动互联网创业的风口,如今渐渐消失,移动互联网被巨头公司瓜分,一些创业公司倒闭了,AndroID 开发需求慢慢趋近于饱和。而当初移动互联网处于风口时,自学、转行以及培训机构出来了大量 AndroID 开发从业者,导致目前看起来市场供大于求。
那么 AndroID 开发工程师们应该如何面对当下的局面呢?其实当下的供需关系不平衡不代表没有需求,市场上过多的是只会写 xml 和 Activity、只会用代码堆需求的初级 AndroID 程序员,而高级 AndroID 开发工程师仍然紧缺,并且薪资很可观。
那么接下来,问题就变成了“如何提升自己在 AndroID 市场上的竞争力”。正文如下Activity面试题Fragment面试题Service面试题broadcast Receiver面试题WebVIEw面试题Binder面试题Handler面试题AsyncTask面试题HandlerThread面试题IntentService面试题视图工作机制面试题事件分发机制面试题ListVIEw面试题AndroID项目构建面试题(由于篇幅太长,今天就先分享到这里)ANR面试题OOM面试题Bitmap面试题UI卡顿面试题内存泄漏面试题内存管理面试题冷启动和热启动面试题其他优化面试题架构模式面试题插件化面试题热更新面试题进程保活面试题lint面试题Kotlin面试题Activity面试题1、Activity是什么
Activity是四大组件之一,它提供一个界面让用户点击和各种滑动 *** 作,这就是Activity
2、Activity四种状态
runingpausedstoppedkilled3、Activity生命周期
onCreate()onStart()onResume()onPause()onStop()onDestroy()onRestart()4、进程的优先级
空进程后台进程服务进程可见进程前台进程5、Activity任务栈
先进后出6、Activity启动模式
standardsingletopsingletasksingleinstance7、scheme跳转协议
AndroID中的scheme是一种页面内跳转协议,通过定义自己的scheme协议,可以跳转到app中的各个页面
服务器可以定制化告诉app跳转哪个页面App可以通过跳转到另一个App页面可以通过H5页面跳转页面Fragment面试题1、Fragment为什么被称为第五大组件
Fragment比Activity更节省内存,其切换模式也更加舒适,使用频率不低于四大组件,且有自己的生命周期,而且必须依附于Activity
2、Activity创建Fragment的方式
静态创建动态创建3、FragmentPageAdapter和FragmentPageStateAdapter的区别
FragmentPageAdapter在每次切换页面的的时候,是将Fragment进行分离,适合页面较少的Fragment使用以保存一些内存,对系统内存不会多大影响
FragmentPageStateAdapter在每次切换页面的时候,是将Fragment进行回收,适合页面较多的Fragment使用,这样就不会消耗更多的内存
4、Fragment生命周期
onAttach()onCreate()onCreateVIEw()onActivityCreated()onStart()onResume()onPause()onStop()onDestroyVIEw()onDestroy()onDetach()5、Fragment的通信
Fragment调用Activity中的方法:getActivityActivity调用Fragment中的方法:接口回调Fragment调用Fragment中的方法:FragmentManager.findFragmentByID6、Fragment的replace、add、remove方法
replace:替代Fragment的栈顶页面add:添加Fragment到栈顶页面remove:移除Fragment栈顶页面Service面试题1、Service是什么
Service是四大组件之一,它可以在后台执行长时间运行 *** 作而没有用户界面的应用组件
2、Service和Thread的区别
Service是安卓中系统的组件,它运行在独立进程的主线程中,不可以执行耗时 *** 作。Thread是程序执行的最小单元,分配cpu的基本单位,可以开启子线程执行耗时 *** 作
Service在不同Activity中可以获取自身实例,可以方便的对Service进行 *** 作。Thread在不同的Activity中难以获取自身实例,如果Activity被销毁,Thread实例就很难再获取得到
3、Service启动方式
startServicebindService4、Service生命周期
startService onCreate()onStartCommand()onDestroy() bindService onCreate()onBind()onUnbind()onDestroy() broadcast Receiver面试题1、broadcast Receiver是什么
broadcast是四大组件之一,是一种广泛运用在应用程序之间传输信息的机制,通过发送Intent来传送我们的数据
2、broadcast Receiver的使用场景
同一App具有多个进程的不同组件之间的消息通信不同App之间的组件之间的消息通信3、broadcast Receiver的种类
普通广播有序广播本地广播Sticky广播4、broadcast Receiver的实现
静态注册:注册后一直运行,尽管Activity、进程、App被杀死还是可以接收到广播
动态注册:跟随Activity的生命周期
5、broadcast Receiver实现机制
自定义广播类继承broadcastReceiver,复写onReceiver()通过Binder机制向AMS进行注册广播广播发送者通过Binder机制向AMS发送广播AMS查找符合相应条件的广播发送到broadcastReceiver相应的循环队列中消息队列执行拿到广播,回调broadcastReceiver的onReceiver()6、LocalbroadcastManager特点
本地广播只能在自身App内传播,不必担心泄漏隐私数据本地广播不允许其他App对你的App发送该广播,不必担心安全漏洞被利用本地广播比全局广播更高效以上三点都是源于其内部是用Handler实现的WebVIEw面试题1、WebVIEw安全漏洞
API16之前存在远程代码执行安全漏洞,该漏洞源于程序没有正确限制使用WebVIEw.addJavaScriptInterface方法,远程攻击者可通过使用Java反射机制利用该漏洞执行任意Java对象的方法
2、WebVIEw销毁步骤
WebVIEw在其他容器上时(如:linearLayout),当销毁Activity时,需要在onDestroy()中先移除容器上的WebVIEw,然后再将WebVIEw.destroy(),这样就不会导致内存泄漏
3、WebVIEw的JsbrIDge
客户端和服务端之间可以通过JavaScript来互相调用各自的方法
4、WebVIEwClIEnt的onPageFinished
WebVIEwClIEnt的onPageFinished在每次完成页面的时候调用,但是遇到未加载完成的页面跳转其他页面时,就会一直调用,使用WebChromeClIEnt.onProgressChanged可以替代
5、WebVIEw后台耗电
在WebVIEw加载页面的时候,会自动开启线程去加载,如果不很好的关闭这些线程,就会导致电量消耗加大,可以采用暴力的方法,直接在onDestroy方法中System.exit(0)结束当前正在运行中的java虚拟机
6、WebVIEw硬件加速
AndroID3.0引入硬件加速,默认会开启,WebVIEw在硬件加速的情况下滑动更加平滑,性能更加好,但是会出现白块或者页面闪烁的副作用,建议WebVIEw暂时关闭硬件加速
7、WebVIEw内存泄漏
由于WebVIEw是依附于Activity的,Activity的生命周期和WebVIEw启动的线程的生命周期是不一致的,这会导致WebVIEw一直持有对这个Activity的引用而无法释放,解决方案如下
独立进程,简单暴力,不过可能涉及到进程间通信(推荐)
动态添加WebVIEw,对传入WebVIEw中使用的Context使用弱引用
Binder面试题1、linux内核的基本知识
进程隔离/虚拟地址空间:进程间是不可以共享数据的,相当于被隔离,每个进程被分配到不同的虚拟地址中
系统调用:linux内核对应用有访问权限,用户只能在应用层通过系统调用,调用内核的某些程序
binder驱动:它负责各个用户的进程,通过binder通信内核来进行交互的模块
2、为什么使用Binder
性能上,相比传统的Socket更加高效安全性高,支持协议双方互相校验3、Binder通信模型
Service服务端通过Binder驱动在ServiceManager的查找表中注册Object对象的add方法
ClIEnt客户端通过Binder驱动在ServiceManager的查找表中找到Object对象的add方法,并返回proxy的add方法,add方法是个空实现,proxy也不是真正的Object对象,是通过Binder驱动封装好的代理类的add方法
当ClIEnt客户端调用add方法时,ClIEnt客户端通过Binder驱动将proxy的add方法,请求ServiceManager来找到Service服务端真正对象的add方法,进行调用
4、AIDL
客户端通过aIDl文件的Stub.asInterface()方法,拿到Proxy代理类
通过调用Proxy代理类的方法,将参数进行封包后,调用底层的transact()方法
transact()方法会回调onTransact()方法,进行参数的解封
在onTransact()方法中调用服务端对应的方法,并将结果返回
Handler面试题1、Handler是什么
Handler通过发送和处理Message和Runnable对象来关联相对应线程的MessageQueue
2、Handler使用方法
post(runnable)sendMessage(message)3、Handler工作原理
4、Handler引起的内存泄漏
原因:非静态内部类持有外部类的匿名引用,导致Activity无法释放
解决:
Handler内部持有外部Activity的弱引用Handler改为静态内部类Handler.removeCallback()AsyncTask面试题1、AsyncTask是什么
它本质上就是一个封装了线程池和Handler的异步框架
2、AsyncTask使用方法
三个参数
Params:表示后台任务执行时的参数类型,该参数会传给AysncTask的doInBackground()方法
Progress:表示后台任务的执行进度的参数类型,该参数会作为onProgressUpdate()方法的参数
Result:表示后台任务的返回结果的参数类型,该参数会作为onPostExecute()方法的参数
五个方法
onPreExecute():异步任务开启之前回调,在主线程中执行
doInBackground():执行异步任务,在线程池中执行
onProgressUpdate():当doInBackground中调用publishProgress时回调,在主线程中执行
onPostExecute():在异步任务执行之后回调,在主线程中执行
onCancelled():在异步任务被取消时回调
3、AsyncTask工作原理
4、AsyncTask引起的内存泄漏
原因:非静态内部类持有外部类的匿名引用,导致Activity无法释放
解决:
AsyncTask内部持有外部Activity的弱引用AsyncTask改为静态内部类AsyncTask.cancel()5、AsyncTask生命周期
在Activity销毁之前,取消AsyncTask的运行,以此来保证程序的稳定
6、AsyncTask结果丢失
由于屏幕旋转、Activity在内存紧张时被回收等情况下,Activity会被重新创建,此时,旧的AsyncTask持有旧的Activity引用,这个时候会导致AsyncTask的onPostExecute()对UI更新无效
7、AsyncTask并行or串行
AsyncTask在AndroID 2.3之前默认采用并行执行任务,AsyncTask在AndroID 2.3之后默认采用串行执行任务
如果需要在AndroID 2.3之后采用并行执行任务,可以调用AsyncTask的executeOnExecutor()
HandlerThread面试题1、HandlerThread产生背景
当系统有多个耗时任务需要执行时,每个任务都会开启一个新线程去执行耗时任务,这样会导致系统多次创建和销毁线程,从而影响性能。为了解决这一问题,Google提供了HandlerThread,HandlerThread是在线程中创建一个Looper循环器,让Looper轮询消息队列,当有耗时任务进入队列时,则不需要开启新线程,在原有的线程中执行耗时任务即可,否则线程阻塞
2、HanlderThread的特点、
HandlerThread本质上是一个线程,继承自ThreadHandlerThread有自己的Looper对象,可以进行Looper循环,可以创建HandlerHandlerThread可以在Handler的handlerMessage中执行异步方法HandlerThread优点是异步不会堵塞,减少对性能的消耗HandlerThread缺点是不能同时继续进行多任务处理,需要等待进行处理,处理效率较低HandlerThread与线程池不同,HandlerThread是一个串行队列,背后只有一个线程。IntentService面试题1、IntentService是什么
IntentService是继承自Service并处理异步请求的一个类,其内部采用HandlerThread和Handler实现的,在IntentService内有一个工作线程来处理耗时 *** 作,其优先级比普通Service高。当任务完成后,IntentService会自动停止,而不需要手动调用stopSelf()。另外,可以多次启动IntentService,每个耗时 *** 作都会以工作队列的方式在IntentService中onHandlerIntent()回调方法中执行,并且每次只会执行一个工作线程
2、IntentService使用方法
创建Service继承自IntentService覆写构造方法和onHandlerIntent()方法在onHandlerIntent()中执行耗时 *** 作文末不管怎么样,不论是什么样的大小面试,要想不被面试官虐的不要不要的,只有刷爆面试题题做好全面的准备,当然除了这个还需要在平时把自己的基础打扎实,这样不论面试官怎么样一个知识点里往死里凿,你也能应付如流啊~
小编将自己6年以来的面试经验和学习笔记都整理成了一个**937页的pdf,**以及我学习进阶过程中看过的一些优质视频教程。**上传在我的文档中:Android架构视频+BATJ面试专题PDF+学习笔记**请君自取,无偿分享!
方法和onHandlerIntent()方法
在onHandlerIntent()中执行耗时 *** 作文末不管怎么样,不论是什么样的大小面试,要想不被面试官虐的不要不要的,只有刷爆面试题题做好全面的准备,当然除了这个还需要在平时把自己的基础打扎实,这样不论面试官怎么样一个知识点里往死里凿,你也能应付如流啊~
小编将自己6年以来的面试经验和学习笔记都整理成了一个**937页的pdf,**以及我学习进阶过程中看过的一些优质视频教程。**上传在我的文档中:Android架构视频+BATJ面试专题PDF+学习笔记**请君自取,无偿分享!
[外链图片转存中…(img-u5F4nols-1618154616731)]
其实看到身边很多朋友抱怨自己的工资很低,包括笔者也是一样的,其原因是在面试过程中没有给面试官一个很好的答案。所以笔者会持续更新面试过程中遇到的问题,也希望大家和笔者一起进步,一起学习。
总结以上是内存溢出为你收集整理的最强整理:一种非常简单的Android屏幕适配方案,附小技巧全部内容,希望文章能够帮你解决最强整理:一种非常简单的Android屏幕适配方案,附小技巧所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)