美文网首页Android开发经验谈Android开发Android技术知识
备战金九银十:Android面试之基础篇+组件篇

备战金九银十:Android面试之基础篇+组件篇

作者: Android架构师丨小熊 | 来源:发表于2019-07-30 22:33 被阅读20次

    基础篇

    • Activity的启动模式、standard、singleTop、singleTask、singleInstance的区别。 这里需要重点注意的是singleTask启动时候的回调onNewIntent以及不同栈之间的Activity如何跳转。我在面试腾讯的时候就被问到过这个问题。

    • Service的启动模式和生命周期,会延伸到Binder和IntentService,这里最好去看下IntentService的原理和源码。看了源码之后还会延伸到HandThread的问题。推荐我自己的博客文章,ServiceIntentService

    • Android消息机制Handler。这是常问也是必问的问题,除了要知道内部原理和源码以外还要清楚造成内存泄漏的原因和处理方式。从源码的角度来谈谈面试常客Handler的内部原理

    • 事件分发原理。这里主要会问事件分发的流程以及进行拦截时候onInterceptTouchEvent返回true时剩下的MOVE与UP如何走,onTouch、onTouchEvent、onClick的先后顺序关系。谈一谈Android中的事件分发

    • AsyncTask内部实现原理。 这个在平安人寿以及投哪儿网二面领导问道过。主要是AsyncTask内部如何实现的,内部处理多任务是串行还是并行处理,为什么是串行处理,如果让其变成并行处理等。从源码角度谈谈AsyncTask的使用及其原理

    • LruCache算法如何实现,内部为什么要用LinkHashMap来实现。 谈谈LruCache算法的底层实现原理及其内部源码

    • 进程之间的通信方式,IPC原理。 这里会延伸到AIDL和Binder。

    • 进程之间的优先级。 前台进程、可见进程、后台进程、不可见进程与空进程。腾讯面的时候还特意问了我进程的保活措施。

    • 图片的压缩处理。 这里会问四种图片格式的区别(ARGB888、RGB565、RGB444、Alpha_8),以及问给出一张以上格式的图片如何计算图片所占的内存大小。

    • Serializable与Parcable的区别。 在什么情况下需要用到序列化和反序列化,Serializable中为什么要设置UID,设置UID与不设置UID值的区别和影响。

    • 动画总结。 重点是属性动画内部实现原理,差值器和估值器的使用。

    • Android中断点续传的原理、热更新的原理。 珍爱网面试我的时候问了这个,当时没了解过,很遗憾的没回答出来。

    • Android的性能优化。 布局优化(include、merge和viewstub标签的使用)、绘制优化(不要在onDraw方法里面创建新的对象)、内存泄漏优化,检测内存的方式和内存泄露造成的原因等。

    • 网络请求原理。 http与https的区别、三次握手和四次挥手,为什么握手一定要三次?为什么挥手一定要四次?http的响应码。http1与http2的区别等。

    • 开源框架的使用和原理。 OkHttp内部实现、glide的内部原理、EventBus源码和RxJava的使用过程注意事项等。

    • 问:Android系统至今有多少种Java虚拟机?分别有什么特点?

    • 问:描述一下Android的apk包生成的过程。

    • 问:使用WebView的时候要注意哪些问题?如何处理WebView造成的内存泄露问题?

    • 问:极光推送能否在应用不运行的情况下收到推送?OneSignal能否在应用不运行的情况下收到推送?为什么?

    • 问:简要描述你上一份工作处理页面过度绘制问题的方法。

    • 问:简要说一下你上一个负责的APP线上有哪些异常,说一下出现次数最多的是哪些?是什么原因导致一直没法完全避免的。

    • 问:了解持续集成吗?说一下Jenkins配置自动打包和代码检测的一些步骤。

    • 问:描述Glide图片加载框架的原理。如果让你去设计一个图片加载框架,会从哪些方面去设计?

    • 问:描述一下Android系统把布局的xml文件渲染成界面视图的过程。

    • 问:有哪些语种是需要做RTL适配的?

    • 问:如果有段文案,里面混杂了阿语和英文,还有数字,直接放到TextView里是否合适?要怎么处理?

    • 问:描述一下图片压缩的原理。等比压缩和像素压缩分别怎么实现的?

    • 问:Kotlin语言是如何避免空指针异常的?

    基础组件篇

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

    1.如果自己没有配置android:ConfigChanges,这时默认让系统处理,就会重建Activity,此时Activity的生命周期会走一遍。

    onSaveInstanceState() 与onRestoreIntanceState()
    资源相关的系统配置发生改变或者资源不足:例如屏幕旋转,当前Activity会销毁,并且在onStop之前回调onSaveInstanceState保存数据,在重新创建Activity的时候在onStart之后回调onRestoreInstanceState。其中Bundle数据会传到onCreate(不一定有数据)和onRestoreInstanceState(一定有数据)。 用户或者程序员主动去销毁一个Activity的时候不会回调,其他情况都会调用,来保存界面信息。如代码中finish()或用户按下back,不会回调。

    2.如果设置 android:configChanges="orientation|keyboardHidden|screenSize">,此时Activity的生命周期不会重走一遍,Activity不会重建,只会回调onConfigurationChanged方法。

    activity的startActivity和context的startActivity区别

    (1)从Activity中启动新的Activity时可以直接mContext.startActivity(intent)就好,

    (2)如果从其他Context中启动Activity则必须给intent设置Flag:

    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK) ; 
    mContext.startActivity(intent);
    复制代码
    

    介绍下Android应用程序启动过程

    整个应用程序的启动过程要执行很多步骤,但是整体来看,主要分为以下五个阶段:

       一. :Launcher通过Binder进程间通信机制通知ActivityManagerService,它要启动一个Activity;
    
       二.:ActivityManagerService通过Binder进程间通信机制通知Launcher进入Paused状态;
    
       三.:Launcher通过Binder进程间通信机制通知ActivityManagerService,它已经准备就绪进入Paused状态,于是ActivityManagerService就创建一个新的进程,用来启动一个ActivityThread实例,即将要启动的Activity就是在这个ActivityThread实例中运行;
    
       四. :ActivityThread通过Binder进程间通信机制将一个ApplicationThread类型的Binder对象传递给ActivityManagerService,以便以后ActivityManagerService能够通过这个Binder对象和它进行通信;
    
       五 :ActivityManagerService通过Binder进程间通信机制通知ActivityThread,现在一切准备就绪,它可以真正执行Activity的启动操作了。
    复制代码
    

    相关文章:Android应用程序启动过程源代码分析

    如何保证Service不被杀死?

    • 提供进程优先级,降低进程被杀死的概率 方法一:监控手机锁屏解锁事件,在屏幕锁屏时启动1个像素的 Activity,在用户解锁时将 Activity 销毁掉。 方法二:启动前台service。 方法三:提升service优先级: 在AndroidManifest.xml文件中对于intent-filter可以通过android:priority = "1000"这个属性设置最高优先级,1000是最高值,如果数字越小则优先级越低,同时适用于广播。
    • 在进程被杀死后,进行拉活 方法一:注册高频率广播接收器,唤起进程。如网络变化,解锁屏幕,开机等 方法二:双进程相互唤起。 方法三:依靠系统唤起。 方法四:onDestroy方法里重启service:service +broadcast 方式,就是当service走ondestory的时候,发送一个自定义的广播,当收到广播的时候,重新启动service;
    • 依靠第三方 根据终端不同,在小米手机(包括 MIUI)接入小米推送、华为手机接入华为推送;其他手机可以考虑接入腾讯信鸽或极光推送与小米推送做 A/B Test。

    简述下Acitivty任务栈和使用方法

    任务栈是一种后进先出的结构。位于栈顶的Activity处于焦点状态,当按下back按钮的时候,栈内的Activity会一个一个的出栈,并且调用其onDestory()方法。如果栈内没有Activity,那么系统就会回收这个栈,每个APP默认只有一个栈,以APP的包名来命名. 1、standard:默认模式:每次启动都会创建一个新的activity对象,放到目标任务栈中

    2、singleTop:判断当前的任务栈顶是否存在相同的activity对象,如果存在,则直接使用,如果不存在,那么创建新的activity对象放入栈中

    3、singleTask:在任务栈中会判断是否存在相同的activity,如果存在,那么会清除该activity之上的其他activity对象显示,如果不存在,则会创建一个新的activity放入栈顶

    4、singleIntance:会在一个新的任务栈中创建activity,并且该任务栈种只允许存在一个activity实例,其他调用该activity的组件会直接使用该任务栈种的activity对象

    方法一: 使用android:launchMode="standard|singleInstance|single Task|singleTop"来控制Acivity任务栈。
    方法二: Intent Flags:

    Intent intent=new Intent();
    intent.setClass(MainActivity.this, MainActivity2.class);
    intent.addFlags(Intent. FLAG_ACTIVITY_CLEAR_TOP);
    startActivity(intent);
    复制代码
    

    Flags有很多,比如:
    Intent.FLAG_ACTIVITY_NEW_TASK 相当于singleTask
    Intent. FLAG_ACTIVITY_CLEAR_TOP 相当于singleTop

    相关文章:Android总结篇系列:Activity Intent Flags及Task相关属性

    Context相关问题

    Activity和Service以及Application的Context是不一样的,Activity继承自ContextThemeWraper.其他的继承自ContextWrapper.
    每一个Activity和Service以及Application的Context都是一个新的ContextImpl对象 getApplication()用来获取Application实例的,但是这个方法只有在Activity和Service中才能调用的到。那么也许在绝大多数情况下我们都是在Activity或者Service中使用Application的,但是如果在一些其它的场景,比如BroadcastReceiver中也想获得Application的实例,这时就可以借助getApplicationContext()方法.
    getApplicationContext()比getApplication()方法的作用域会更广一些,任何一个Context的实例,只要调用getApplicationContext()方法都可以拿到我们的Application对象。

    Context的数量等于Activity的个数 + Service的个数 + 1,这个1为Application.
    那Broadcast Receiver,Content Provider呢?Broadcast Receiver,Content Provider并不是Context的子类,他们所持有的Context都是其他地方传过去的,所以并不计入Context总数。

    怎么在Service中创建Dialog对话框

    1.在我们取得Dialog对象后,需给它设置类型,即:
    dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT)

    2.在Manifest中加上权限:
    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />

    最后

    最后送给大家一句话,你觉得晚的时候恰恰是最早的时候,快动手,想做就做,你学习的技能肯定会有用武之地的,所以在这里我也将之前准备面试题整理出来,除了面试题,还总结出了互联网公司Android程序员面试涉及到的绝大部分面试题及答案,并整理做成了文档,以及系统的进阶学习视频资料,免费分享给大家,希望能帮助到你面试前的复习,且找到一个好的工作,也节省大家在网上搜索资料的时间来学习。

    资料领取方式:加群797404811

    相关文章

      网友评论

        本文标题:备战金九银十:Android面试之基础篇+组件篇

        本文链接:https://www.haomeiwen.com/subject/qygorctx.html