安卓面试:android部分

1. Activity 的生命周期是什么? onPause 和 onStop 有什么区别?

  • onCreate --> onStart --> onResume --> onPause --> onStop --> onDestory --> onRestart
  • onStart和onStop是从Activity是否可见这个角度回调的,onResume和onPause是从Activity是否位于前台这个角度来回调的

2. Android 五种布局的性能对比?

  • 五种布局:AbsoluteLayout、TableLayout、LinearLayout、FrameLayout、RelativeLayout
  • 性能对比:开发中常用的布局其实就有两个:LinearLayout、RelativeLayout。LinearLayout是一种简单高效的ViewGroup,它的 布局过程就花费更少的CPU时间,而RelativeLayout的功能比较复杂,如果一个LinearLayout无法实现的效果,需要通过嵌套的方式来完成,这时候就可以考虑使用RelativeLayout了,因为ViewGroup的嵌套相当于增加了布局的层级,会降低程序的性能。

3. Android 四大组件是什么?分别说说对它们的理解?

  • 四大组件:Activity、Service、BroadcastReceiver、ContentProvider
  • Activity是一种展示型组件,用于向用户直接地展示一个界面,并且可以接受用户输入的信息从而进行交互;Service是一种计算型组件,用于在后台执行一系列计算任务;BroadcastReceiver是一种消息型组件,用于在不用的组件乃至不同的应用之间传递消息;ContentProvider是一种数据共享型组件,用于向其他组件或者其它应用共享数据。

4. 关于 Service 的理解?它的启动方式有什么区别?

  • Service是一种计算型组件,运行在后台进程中,然后将其计算结果返回调用者。
  • 启动方式有两种:startService和bindService
    1. 生命周期不同,前者:onCreate --> onStartCommand --> onDestory;后台:onCreate --> onBinde --> onUnbind --> onDestory。启动前者的组件即使被销毁了,该service还会在后台无限期运行,除非调用stopService;启动后者的组件被销毁了,该service就随之停止。
    2. 停止service的方式不同,前者stopService(),后台unbindService
    3. 前者启动service后,该servie就处于独立运行状态;后者通过ServiceConnection与组件进行通信,利用IPC跨进程

5. 了解 fragment 吗?说说你对它的理解?

  • fragment是Android3.0的特性,主要是为了解决Android Pad屏幕比较大,空间不能充分利用的问题。现在常常把Fragment作为Activity的一部分,fragment比较小巧灵活,可以动态地添加、移除和替换。
    自定义过 view 吗?它的步骤是什么?说说你自定义 view 过程中出现的问题,以及是如何解决的?
  • view的绘制是从根节点DecorView开始的,它是一个自上而下的过程,view的绘制经过三个阶段:Measure、layout、Draw。

6. 刷新 view 的几种方式,他们有什么区别?

  • 两种:invalidate、postinvalidate
  • 前者是在UI线程自身中使用,而后者在非UI线程中使用。
  • 其实有个requestLayout()方法,当view宽高、位置改变而内容不变时,可回调这个函数。而前两者是在内容发生改变时回调的。

7. Android 实现数据存储的几种方式?

  • 文件
  • Sqlite
  • SharePreference
  • xml
  • 网络

8. 如何实现 Android 中的缓存的,通过使用第三方库和自定义来分别说明一下缓存技术的实现?

  • Android的缓存,主要做好内存缓存和文件缓存,比较常用的策略是LruCache和DiskLruCache。Lru是Least Recently Used的缩写,即最近最少使用算法,当缓存快满的时候,清除掉最近最少使用的缓存。

9. 如何实现 Activity 与 fragment 的通信?
10. Android 5.0、6.0、7.0 新特性?
11. Android 中的动画分类?
12. 你以前是如何进行屏幕适配的?
13. 说说 Activity 创建过程?

14. Android 中如何与 JS 交互的?

15. 了解 APP 的启动流程?
16. 你知道哪些图片加载库?他们有什么区别?ImageLoader 的内部缓存机制是什么?是如何实现的?
17. Android 中是如何实现异步通信的?

  • 异步通讯其实就是主线程和子线程的通讯,主线程是不安全的线程,一些耗时IO操作等都是在子线程中,然后将计算结果返回主线程完成UI更新。AsynTask、Handler、RxJava都能实现异步通讯,AsynTask比较简单,内部分装了handler和线程池,过程有回调、可控,但是要执行多个异步时就会变得复杂;Handler更简单,子线程发送一个Message给主线程即可;RxJava很强大,而且简洁。

18. 说说 Handler 内部实现原理?为什么Looper.loop是死循环不会阻塞主线程?postDelayed是怎么做到延迟的?

  • Handler常用于子线程和主线程之前的通讯,比如子线程是不能直接修改UI的,只能主线程来完成,如果修改只能让子线程想主线程通过handler发送message,然后在主线程中修改。Handler整个机制的实现,还依赖Looper、Message、MessageQueue,在主线程中Android默认给我们创建了Looper,Looper有初始化了一个MessageQueue,当通过handler.sendMessage()后,该消息被添加到MessageQueue中,Looper.loop()会不断地从消息队列取出消息,然后又交给handler.handleMessage处理。取消息的过程是线程阻塞的,这样不至于在没有消息的时候过多地消耗CPU资源。
  • 其实整个Android就是在一个looper的loop循环中,整个Android的一切都是以Handler机制进行的,即只要有代码指定都是通过Handler来执行的,一旦没有消息,Linux的epoll机制则会通过管道写文件描述符的方式对主线程进行唤醒和睡眠,Android里调用了linux层代码实现在适当的时候睡眠主线程,因此不会阻塞主线程。其实真正卡死主线程的操作是在回调方法onCreate等操作时间过长,会导致掉帧,甚至会发生ANR,loop死循环本身不会卡死应用。
    ·
    19. 使用过 AsyncTask 吗?说说它的内部实现原理?它有什么缺陷?如何改进?
  • AsyncTask是一种轻量级的异步任务类,它可以在线程池中执行后台任务,然后把执行的进度和结果传递给主线程并在主线程中更新UI。AsyncTask主要是封装了Thread和Handler,Android3.0后,AsyncTask采用一个线程来执行任务。AsyncTask中有两个线程池SerialExecutor和THREAD_POOL_EXECUTOR和一个InternalHandler,第一个线程池用于任务排队,而第二个线程池用于真正执行任务,InternalHandler将执行环境从线程池切换到主线程。
  • AsyncTask的缺点:同一时间最多只能执行5个线程,3.0以后想要并行执行任务,调用executeOnExecutor即可,其他线程将被阻塞,在用于获取网络数据的时候,很可能产生阻塞,从而降低效率。

20. 知道 JNI、Binder 吗?说说你对它们的理解?
21. 如何实现进程间的通信?
22. 说说 Android view 和 viewGroup 的事件分发机制?
23. 你开发过程中使用到了哪些第三方库?了解过他们的源码吗?
24. 你了解广播吗?它与 EventBus 有什么区别?能互相实现吗?
25. 你们网络请求是如何实现的?知道 Volley 吗?内部实现流程是什么?它与 OKHttp 有什么区别?
26. 接触过 MVP 模式吗?说说看对它的认识?
27. 知道 Android 中的多渠道打包吗?
28. Android 签名机制的原理?反编译解压后的文件夹所包含的内容有哪些?
29. 你了解过模块化、组件化开发吗?
30. 开始开发 APP 如何进行架构?
31. APP 工程模块是如何划分的?你是如何进行封装的?
32. APP 是如何进行优化的?知道 OOM 吗?如何解决内存泄漏?

你可能感兴趣的:(安卓面试:android部分)