- 技术点:Service类型(系统Service)
- 参考回答:
Q:是否能在Service进行耗时操作?如果非要可以怎么做?
- 技术点:Service使用注意
- 参考回答:Service默认并不会运行在子线程中,也不运行在一个独立的进程中,它同样执行在主线程中(UI线程)。换句话说,不要在Service里执行耗时操作,除非手动打开一个子线程,否则有可能出现主线程被阻塞(ANR)的情况。
- 引申:可以引申谈谈开子线程的几种方法
Q:AlarmManager能实现定时的原理?
- 技术点:系统服务(后台定时)
- 思路:AlarmManager
- 参考回答:通过调用AlarmManager的 set() 方法就可以设置一个定时任务,并提供三个参数(工作类型,定时任务触发的时间,PendingIntent对象)。其中第三个PendingIntent对象是关键,一般会调用它的 getBroadcast() 方法来获取一个能够执行广播的PendingIntent。这样当定时任务被触发的时候,广播接收器的onReceive()方法就可以得到执行。即通过服务和广播的循环触发实现定时服务。
- 引申:可谈谈底层定时机制实现原理
Q:前台服务是什么?和普通服务的不同?如何去开启一个前台服务?
- 技术点:Service类型(前台Service)
- 参考回答:和一般运行在后台的服务不同,前台服务的服务状态可以被用户一眼看到。它和普通服务最大的区别是,前者会一直有一个正在运行的图标在系统的状态栏显示,下拉状态栏后可以看到更加详细的信息,非常类似于通知的效果,且当系统内存不足服务被杀死时,通知会被移除。实现一个前台服务也非常简单,和发送一个通知非常类似,只不过在构建好一个Notification之后,不需要NotificationManager将通知显示出来,而是调用了 startForeground() 方法。
Q:是否了解ActivityManagerService,谈谈它发挥什么作用?
- 技术点:Service类型(ActivityManagerService)
- 思路:可谈谈在四大组件创建中ActivityManagerService发挥的作用,详见要点提炼|开发艺术之四大组件
- 参考回答:ActivityManagerService是Android中最核心的服务 , 主要负责系统中四大组件的启动、切换、调度及应用进程的管理和调度等工作,其职责与操作系统中的进程管理和调度模块类似。
- 引申:看源码谈谈AMS启动过程:ActivityManagerService分析——AMS启动流程
Q:如何保证Service不被杀死?
- 技术点:Service应用
- 思路:列举几种解决办法
- 参考回答:可以采取以下几种解决方法:
- 在Service的onStartCommand()中设置flages值为START_STICKY,使得Service被杀死后尝试再次启动Service
- 提升Service优先级,比如设置为一个前台服务
- 在Activity的onDestroy()通过发送广播,并在广播接收器的onReceive()中启动Service
Q:广播有几种形式?什么特点?
- 技术点:Broadcast类型
- 思路:分条解释每种广播类型的特点
- 参考回答:常见以下四种广播:
- 普通广播:一种完全异步执行的广播,在广播发出之后,所有的广播接收器几乎都会在同一时刻接收到这条广播消息,因此它们接收的先后是随机的。
- 有序广播:一种同步执行的广播,在广播发出之后,同一时刻只会有一个广播接收器能够收到这条广播消息,当这个广播接收器中的逻辑执行完毕后,广播才会继续传递,所以此时的广播接收器是有先后顺序的,且优先级(priority)高的广播接收器会先收到广播消息。有序广播可以被接收器截断使得后面的接收器无法收到它。
- 本地广播:发出的广播只能够在应用程序的内部进行传递,并且广播接收器也只能接收本应用程序发出的广播。
- 粘性广播:这种广播会一直滞留,当有匹配该广播的接收器被注册后,该接收器就会收到此条广播。
Q:广播的两种注册形式?区别在哪?
- 技术点:Broadcast使用
- 参考回答:广播的注册有两种方法:一种在活动里通过代码动态注册,另一种在配置文件里静态注册。两种方式的相同点是都完成了对接收器以及它能接收的广播值这两个值的定义;不同点是动态注册的接收器必须要在程序启动之后才能接收到广播,而静态注册的接收器即便程序未启动也能接收到广播,比如想接收到手机开机完成后系统发出的广播就只能用静态注册了。
Q:ContentProvider了解多少?
- 技术点:ContentProvider
- 思路:ContentProvider功能
- 参考回答:作为四大组件之一,ContentProvider主要负责存储和共享数据。与文件存储、SharedPreferences存储、SQLite数据库存储这几种数据存储方法不同的是,后者保存下的数据只能被该应用程序使用,而前者可以让不同应用程序之间进行数据共享,它还可以选择只对哪一部分数据进行共享,从而保证程序中的隐私数据不会有泄漏风险。
- 引申:谈谈ContentProvider底层使用Binder机制原理
Q:Android中提供哪些数据持久存储的方法?
- 技术点:数据持久化
- 思路:分条解释每种数据持久存储的特点
- 参考回答:Android平台实现数据存储的常见几种方式:
- File 文件存储:写入和读取文件的方法和 Java中实现I/O的程序一样。
- SharedPreferences存储:一种轻型的数据存储方式,常用来存储一些简单的配置信息,本质是基于XML文件存储key-value键值对数据。
- SQLite数据库存储:一款轻量级的关系型数据库,它的运算速度非常快,占用资源很少,在存储大量复杂的关系型数据的时可以使用。
- ContentProvider:四大组件之一