写点什么

作为一名 Android 面试官,这些面试官常问的开发面试题你都掌握好了吗?(1)

用户头像
Android架构
关注
发布于: 刚刚

Service 生命周期的各个回调和其他的应用组件一样,是跑在主线程中,会影响到你的 UI 操作或者阻塞主线程中的其他事情

9.请介绍下 AsyncTask 的内部实现,适用的场景是?

AsyncTask 内部也是 Handler 机制来完成的,只不过 Android 提供了执行框架来提供线程池来执行相应地任务,因为线程池的大小问题,所以 AsyncTask 只应该用来执行耗时时间较短的任务,比如 HTTP 请求,大规模的下载和数据库的更改不适用于 AsyncTask,因为会导致线程池堵塞,没有线程来执行其他的任务,导致的情形是会发生 AsyncTask 根本执行不了的问题。

10.谈谈你对 binder 机制的理解?

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

11.Android 中进程间通信有哪些实现方式?

Intent,Binder(AIDL),Messenger,BroadcastReceiver

12.介绍下实现一个自定义 view 的基本流程

1、自定义 View 的属性 编写 attr.xml 文件 2、在 layout 布局文件中引用,同时引用命名空间 3、在 View 的构造方法中获得我们自定义的属性 ,在自定义控件中进行读取(构造方法拿到 attr.xml 文件值)4、重写 onMesure5、重写 onDr


《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》
浏览器打开:qq.cn.hn/FTe 免费领取
复制代码


aw

13.Android 中 touch 事件的传递机制是怎样的?

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

14.Android 多线程的实现方式有哪些?

Thread & AsyncTask


Thread 可以与 Loop 和 Handler 共用建立消息处理队列 AsyncTask 可以作为线程池并行处理多任务

15.Android 开发中何时使用多进程?使用多进程的好处是什么?

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


那如何让自己的应用拥有多个进程?


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


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


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


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


最近面试被怼了?缺面试题刷提升自己吗?


点击:


Android学习PDF+架构视频+面试文档+源码笔记


来获取学习资料提升自己去挑战一下 BAT 面试难关吧

16.ANR 是什么?怎样避免和解决 ANR?

**ANR:**Application Not Responding,即应用无响应 ANR 一般有三种类型:


1:KeyDispatchTimeout(5 seconds) –主要类型按键或触摸事件在特定时间内无响应


2:BroadcastTimeout(10 seconds)BroadcastReceiver 在特定时间内无法处理完成


3:ServiceTimeout(20 seconds) –小概率类型 Service 在特定的时间内无法处理完成


超时的原因一般有两种:


(1)当前的事件没有机会得到处理(UI 线程正在处理前一个事件没有及时完成或者 looper 被某种原因阻塞住)(2)当前的事件正在处理,但没有及时完成


UI 线程尽量只做跟 UI 相关的工作,耗时的工作(数据库操作,I/O,连接网络或者其他可能阻碍 UI 线程的操作)放入单独的线程处理,尽量用 Handler 来处理 UI thread 和 thread 之间的交互。


UI 线程主要包括如下:


Activity:onCreate(), onResume(), onDestroy(), onKeyDown(), onClick()AsyncTask: onPreExecute(), onProgressUpdate(), onPostExecute(), onCancel()Mainthread handler: handleMessage(), post(runnable r)other

17.Android 下解决滑动冲突的常见思路是什么?

相关的滑动组件 重写 onInterceptTouchEvent,然后判断根据 xy 值,来决定是否要拦截当前操作

18.如何把一个应用设置为系统应用?

成为系统应用,首先要在 对应设备的 Android 源码 SDK 下编译,编译好之后:


此 Android 设备是 Debug 版本,并且已经 root,直接将此 apk 用 adb 工具 push 到 system/app 或 system/priv-app 下即可。


如果非 root 设备,需要编译后重新烧写设备镜像即可。


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

19、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 机制,同样存在内存泄漏的风险。此种内存泄露,一般是临时性的。

20.内存泄露检测有什么好方法?

检测:


1、DDMS Heap 发现内存泄露 dataObject totalSize 的大小,是否稳定在一个范围内,如果操作程序,不断增加,说明内存泄露 2、使用 Heap Tool 进行内存快照前后对比 BlankActivity 手动触发 GC 进行前后对比,对象是否被及时回收


定位:


1、MAT 插件打开.hprof 具体定位内存泄露:查看 histogram 项,选中某一个对象,查看它的 GC 引用链,因为存在 GC 引用链的,说明无法回收 2、AndroidStudio 的 Allocation Tracker:

用户头像

Android架构

关注

还未添加个人签名 2021.10.31 加入

还未添加个人简介

评论

发布
暂无评论
作为一名Android面试官,这些面试官常问的开发面试题你都掌握好了吗?(1)