ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
### Service #### 1、谈一谈Service的生命周期? > * 参考回答:Service的生命周期涉及到六大方法 > * **onCreate()**:如果service没被创建过,调用startService()后会执行onCreate()回调;如果service已处于运行中,调用startService()不会执行onCreate()方法。也就是说,**onCreate()只会在第一次创建service时候调用,多次执行startService()不会重复调用onCreate(),此方法适合完成一些初始化工作**; > * **onStartComand()**:服务启动时调用,此方法适合完成一些数据加载工作,比如会在此处创建一个线程用于下载数据或播放音乐; > * **onBind()**:服务被绑定时调用; > * **onUnBind()**:服务被解绑时调用; > * **onRebind()**:服务被重新绑定时调用 > * **onDestroy()**:服务停止时调用; > * 推荐文章: > * [Android组件系列----Android Service组件深入解析](https://www.cnblogs.com/smyhvae/p/4070518.html) #### 2、Service的两种启动方式?区别在哪? > * 参考回答:Service的两种启动模式 > * **startService()**:通过这种方式调用startService,onCreate()只会被调用一次,多次调用startSercie会多次执行onStartCommand()方法。如果外部没有调用stopService()或stopSelf()方法,service会一直运行。 > * **bindService()**:如果该服务之前**还没创建**,系统回调顺序为onCreate()→onBind()。如果调用bindService()方法前服务**已经被绑定**,多次调用bindService()方法不会多次创建服务及绑定。如果调用者希望与正在绑定的服务**解除绑定**,可以调用unbindService()方法,回调顺序为onUnbind()→onDestroy(); > ![](https://img.kancloud.cn/21/5f/215f12b75124f83e6d5ddecde1dd073c_407x520.jpg) > > * 推荐文章: > * [Android Service两种启动方式详解](https://www.jianshu.com/p/4c798c91a613) #### 3、如何保证Service不被杀死 ? > * 参考回答: > * [如何保证Service不被杀死?](https://juejin.im/post/5e5c5e306fb9a07cbe346d71#heading-136) > * **onStartCommand方式中,返回START\_STICKY或则START\_REDELIVER\_INTENT** > * **START\_STICKY**:如果返回START\_STICKY,表示Service运行的进程被Android系统强制杀掉之后,Android系统会将该Service依然设置为started状态(即运行状态),但是不再保存onStartCommand方法传入的intent对象。此常量适用于不执行命令、但无限期运行并等待作业的媒体播放器(或类似服务)。 > * **START\_NOT\_STICKY**:如果返回START\_NOT\_STICKY,表示当Service运行的进程被Android系统强制杀掉之后,不会重新创建该Service。如果系统在`onStartCommand()`返回后终止服务,则除非有待传递的挂起 Intent,否则系统*不会*重建服务。 > * **START\_REDELIVER\_INTENT**:如果返回START\_REDELIVER\_INTENT,其返回情况与START\_STICKY类似,但不同的是系统会保留最后一次传入onStartCommand方法中的Intent,再次保留下来并再次传入到重新创建后的Service的onStartCommand方法中。**此常量适用于主动执行应立即恢复的作业(例如下载文件)的服务**。 > * **提高Service的优先级** 在AndroidManifest.xml文件中对于intent-filter可以通过android:priority = "1000"这个属性设置最高优先级,1000是最高值,如果数字越小则优先级越低,同时适用于广播; > * **在onDestroy方法里重启Service** 当service走到onDestroy()时,发送一个自定义广播,当收到广播时,重新启动service; > * **提升Service进程的优先级——启动前台Service**, 进程优先级由高到低:前台进程 一 可视进程 一 服务进程 一 后台进程 一 空进程,可以使用startForeground将service放到前台状态,这样低内存时,被杀死的概率会低一些; > * **系统广播监听Service状态** > * **将APK安装到/system/app,变身为系统级应用** > * **注意**:以上机制都不能百分百保证Service不被杀死,除非做到系统白名单,与系统同生共死 #### 4、能否在Service开启耗时操作 ? 怎么做 ? > * 参考回答: > * Service默认并不会运行在子线程中,也不运行在一个独立的进程中,它**同样执行在主线程中(UI线程)**。换句话说,**不要在Service里执行耗时操作,除非手动打开一个子线程**,否则有可能出现主线程被阻塞(ANR)的情况; #### 5、用过哪些系统Service ? > * 参考回答: > ![](https://img.kancloud.cn/73/4c/734c1505d44351f75abb6824c8461a9c_560x306.jpg) > #### 6、了解ActivityManagerService吗?发挥什么作用 > * 参考回答: ActivityManagerService是Android中最核心的服务 , 主要负责系统中四大组件的启动、切换、调度及应用进程的管理和调度等工作,其职责与操作系统中的进程管理和调度模块类似; > * 推荐文章: > * [ActivityManagerService启动过程](http://gityuan.com/2016/02/21/activity-manager-service/) > * [ActivityManagerService分析——AMS启动流程](https://blog.csdn.net/caohang103215/article/details/79597260)