最全Android面试大纲(一)【含答案】

APK安装过程

应用安装涉及到如下几个目录:

  • system/app:系统自带的应用程序,无法删除
  • data/app:用户程序安装的目录,有删除权限。安装时把apk文件复制到此目录
  • data/data:存放应用程序的数据
  • data/dalvik-cache:将apk中的dex文件安装到dalvik-cache目录下

复制APK安装包到data/app目录下,解压并扫描安装包,把dex文件(Dalvik字节码)保存到dalvik-cache目录,并在data/data目录下创建对应的应用数据目录。

invalidate()和postInvalidate() 的区别

  • invalidate()是用来刷新View的,必须是在UI线程中进行工作。比如在修改某个view的显示时,调用invalidate()才能看到重新绘制的界面。
  • postInvalidate()在工作者线程中被调用。

导入外部数据库

Android系统下数据库应该存放在 /data/data/com..(package name)/ 目录下,所以我们需要做的是把已有的数据库传入那个目录下。操作方法是用FileInputStream读取原数据库,再用FileOutputStream把读取到的东西写入到那个目录。

Parcelable和Serializable区别

Parcelable的性能比Serializable好,在内存开销方面较小,所以在内存间数据传输时推荐使用Parcelable,如activity间传输数据,而Serializable可将数据持久化方便保存,所以在需要保存或网络传输数据时选择Serializable,因为android不同版本Parcelable可能不同,所以不推荐使用Parcelable进行数据持久化。

Serializable序列化不保存静态变量,可以使用Transient关键字对部分字段不进行序列化,也可以覆盖writeObject、readObject方法以实现序列化过程自定义。

Android里跨进程传递数据的几种方案

  • Binder
  • Socket/LocalSocket
  • 共享内存

匿名共享内存,使用场景

在Android系统中,提供了独特的匿名共享内存子系统Ashmem(Anonymous Shared Memory),它以驱动程序的形式实现在内核空间中。它有两个特点,一是能够辅助内存管理系统来有效地管理不再使用的内存块,二是它通过Binder进程间通信机制来实现进程间的内存共享。

ashmem并像Binder是Android重新自己搞的一套东西,而是利用了Linux的 tmpfs文件系统。tmpfs是一种可以基于RAM或是SWAP的高速文件系统,然后可以拿它来实现不同进程间的内存共享。

大致思路和流程是:

  • Proc A 通过 tmpfs 创建一块共享区域,得到这块区域的 fd(文件描述符)
  • Proc A 在 fd 上 mmap 一片内存区域到本进程用于共享数据
  • Proc A 通过某种方法把 fd 倒腾给 Proc B
  • Proc B 在接到的 fd 上同样 mmap 相同的区域到本进程
  • 然后 A、B 在 mmap 到本进程中的内存中读、写,对方都能看到了

其实核心点就是 创建一块共享区域,然后2个进程同时把这片区域 mmap 到本进程,然后读写就像本进程的内存一样。这里要解释下第3步,为什么要倒腾 fd,因为在 linux 中 fd 只是对本进程是唯一的,在 Proc A 中打开一个文件得到一个 fd,但是把这个打开的 fd 直接放到 Proc B 中,Proc B 是无法直接使用的。但是文件是唯一的,就是说一个文件(file)可以被打开多次,每打开一次就有一个 fd(文件描述符),所以对于同一个文件来说,需要某种转化,把 Proc A 中的 fd 转化成 Proc B 中的 fd。这样 Proc B 才能通过 fd mmap 同样的共享内存文件。

使用场景:进程间大量数据传输。

ContentProvider实现原理

ContentProvider 有以下两个特点:

  • 封装:对数据进行封装,提供统一的接口,使用者完全不必关心这些数据是在DB,XML、Preferences或者网络请求来的。当项目需求要改变数据来源时,使用我们的地方完全不需要修改。
  • 提供一种跨进程数据共享的方式。

Content Provider组件在不同应用程序之间传输数据是基于匿名共享内存机制来实现的。其主要的调用过程:

  1. 通过ContentResolver先查找对应给定Uri的ContentProvider,返回对应的BinderProxy
  • 如果该Provider尚未被调用进程使用过:

    • 通过ServiceManager查找activity service得到ActivityManagerService对应BinderProxy
    • 调用BinderProxy的transcat方法发送GET_CONTENT_PROVIDER_TRANSACTION命令,得到对应ContentProvider的BinderProxy。
      如果该Provider已被调用进程使用过,则调用进程会保留使用过provider的HashMap。此时直接从此表查询即得。
  1. 调用BinderProxy的query()

如何使用ContentProvider进行批量操作?

通常进行数据的批量操作我们都会使用“事务”,但是ContentProvider如何进行批量操作呢?创建 ContentProviderOperation 对象数组,然后使用 ContentResolver.applyBatch() 将其分派给内容提供程序。您需将内容提供程序的授权传递给此方法,而不是特定内容 URI。这样可使数组中的每个 ContentProviderOperation 对象都能适用于其他表。调用 ContentResolver.applyBatch() 会返回结果数组。

同时我们还可以通过ContentObserver对数据进行观察:

  1. 创建我们特定的ContentObserver派生类,必须重载onChange()方法去处理回调后的功能实现
  2. 利用context.getContentResolover()获得ContentResolove对象,接着调用registerContentObserver()方法去注册内容观察者,为指定的Uri注册一个ContentObserver派生类实例,当给定的Uri发生改变时,回调该实例对象去处理。
  3. 由于ContentObserver的生命周期不同步于Activity和Service等,因此,在不需要时,需要手动的调用unregisterContentObserver()去取消注册。

Application类的作用

Android系统会为每个程序运行时创建一个Application类的对象且仅创建一个,所以Application可以说是单例 (singleton)模式的一个类。Application对象的生命周期是整个程序中最长的,它的生命周期就等于这个程序的生命周期。因为它是全局的单例的,所以在不同的Activity,Service中获得的对象都是同一个对象。所以通过Application来进行一些,数据传递,数据共享,数据缓存等操作。

广播注册后不解除注册会有什么问题?(内存泄露)

我们可以通过两种方式注册BroadcastReceiver,一是在Activity启动过程中通过代码动态注册,二是在AndroidManifest.xml文件中利用标签进行静态注册。

  • 对于第一种方法,我们需要养成一个良好的习惯:在Activity进入停止或者销毁状态的时候使用unregisterReceiver方法将注册的BroadcastReceiver注销掉。
  • 对于标签进行注册的,那么该对象的实例在onReceive被调用之后就会在任意时间内被销毁。

属性动画(Property Animation)和补间动画(Tween Animation)的区别

  • 补间动画只是针对于View,超脱了View就无法操作了。
  • 补间动画有四种动画操作(移动,缩放,旋转,淡入淡出)。
  • 补间动画只是改变View的显示效果而已,但是不会真正的去改变View的属性。
  • 属性动画改变View的实际属性值,当然它也可以不作用于View。

BrocastReceive里面可不可以执行耗时操作?

不能,当 onReceive() 方法在 10 秒内没有执行完毕,Android 会认为该程序无响应,所以在BroadcastReceiver里不能做一些比较耗时的操作,否侧会弹出 ANR 的对话框。

文末送福利啦!!

我总结出了互联网公司Android程序员面试涉及到的绝大部分面试题及答案,并整理做成了文档,以及系统的进阶学习视频资料,免费分享给大家。
(包括Java在Android开发中应用、APP框架知识体系、高级UI、全方位性能调优,NDK开发,音视频技术,人工智能技术,跨平台技术等技术资料),希望能帮助到你面试前的复习,且找到一个好的工作,也节省大家在网上搜索资料的时间来学习。
资料领取方式:点击链接加入群聊【Android开发交流】:https://jq.qq.com/?_wv=1027&k=57fcAxd,找群管理免费领取。备注一下看到的来领取资料就可以了!

你可能感兴趣的:(最全Android面试大纲(一)【含答案】)