前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Android高频面试专题 - 基础篇(三)Service

Android高频面试专题 - 基础篇(三)Service

作者头像
Android扫地僧
发布2020-03-19 15:52:08
7230
发布2020-03-19 15:52:08
举报
文章被收录于专栏:Android进阶

点击上方 Android扫地僧 ,选择 星标 公众号

重磅资源、干货分享,快上车!

Service在日常开发中的使用,也是非常广泛,这里基本上罗列了面试会问到的关于Service的问题,面试前看看应该是足够了。

1、Service两种启动模式及生命周期

①Service生命周期内实例只会有一个,多次调用startService(),只有第一次会出发onCreate(),后面只会出发onStartCommand, bindService()同理,多次绑定只会出发onBind()。

②通过startService()启动的服务,生命周期不受客户端组件影响,只能通过主动调用stop()来停止。

③通过bindService()启动的服务,只有所有客户端都执行unBind(),服务才会被销毁。

④startService()优先级高于bindService(),只要有一个startService(),即使所有客户端都执行unBind(),也不会被销毁。

完整生命周期如下:

2、Service和Thread

看下官网对Service的介绍:服务是可以在后台执行长时间运行的操作的应用程序组件,并且不提供用户界面。也就是说,如果你的应用需要在子线程执行工作,并且要和用户有交互,可以选择新建一个Thread,如果不需要交互,可以选择通过服务,比如后台播放音乐。

3、Service里面到底能不能执行耗时操作?

答案肯定是不能的,虽然Service定位是在后台执行长时间的操作,但是Service默认也是在主线程执行的,前面ANR讲过,前台服务执行超过20s就会ANR,平时你也许直接Service里面干过不算太久的耗时操作,并且看起来没什么事,那是因为后台服务ANR时间是200s。

正确做法是在Service内部开启子线程,或者直接使用IntentService。再者,在清单文件中显式给Service声明一个进程,注意不是线程。

代码语言:javascript
复制
<service    android:name="com.baidu.location.f"    android:enabled="true"    android:process=":remote" ></service>

4、IntentService实现原理

IntentService是Service的一个子类,使用工作线程来处理所有的启动请求,但是一次只能处理一个。其内部使用HandleThread实现,每次请求都会在onStartCommand()里面向 ServiceHandler发送一个Message,在handleMessage内部调用onHandleIntent来处理我们的业务逻辑,并且执行完会stopSelf(startId)自己销毁。

5、stopSelf()与stopSelf(startId)的区别

每一次调用startService(),在onStartCommand()方法中,会产生一个startId,stopSelf()默认会传一个startId为-1,表示停止所有请求,会销毁服务,而stopSelf(startId)只会停止startId的这一次请求。上面IntentService中,每一次onHandleIntent()之后stopSelf(startId)停止当前请求,所有任务执行完后,才会销毁服务。

6、onStartCommand()返回值的含义

  • START_STICKY=1:如果 service 进程被 kill 掉,保留 service 的状态为开始状态,但不保留递送的 intent 对象。随 后系统会尝试重新创建 service,由于服务状态为开始状态,所以创建服务后一定会调用 onStartCommand(Intent,int,int)方法。如果在此期间没有任何启动命令被传递到 service,那么参数 Intent 将为 null。
  • START_NOT_STICKY=2:“非粘性的”。使用这个返回值时,如果在执行完 onStartCommand 后,服务被异常 kill 掉,系统不会自动重启该服务。
  • START_REDELIVER_INTENT=3:重传 Intent。使用这个返回值时,如果在执行完 onStartCommand 后,服务被异 常 kill 掉,系统会自动重启该服务,并将 Intent 的值传入。
  • START_STICKY_COMPATIBILITY=0: START_STICKY 的兼容版本,但不保证服务被 kill 后一定能重启。

7、onRebind()什么时候被调用

首先前提是onUnbind()方法返回true,此前该服务的所有的绑定已经unBind(), 然后在新的客户端已连接到该服务时就会调用。

8、前台服务是什么?如何启动

前台服务是用户可感知的,前台服务与Notification共存亡,启动前台服务通过startForeground(int id, Notification notification)传入一个通知,并且服务停止前,此通知无法移除。

9、Service里面可以进行哪些操作?

  • 弹Toast, 可以直接使用。
  • 弹Dialog,必须申请 "android.permission.SYSTEM_ALERT_WINDOW"权限,并且设置type为TYPE_SYSTEM_ALERT,8.0后设置为TYPE_APPLICATION_OVERLAY
  • startActivity, 可以,必须添加FLAG_ACTIVITY_NEW_TASK
  • 发广播,可以直接使用

10、如何提高服务的优先级

  • 设置为前台广播,也是最有效的,之前灰色保活方案使用过
  • 设置优先级,清单文件中intent-filter可以通过android:priority = “1000”设置优先级
  • onStartCommand方法,返回START_STICKY
  • 清单文件中Application加上Persistent属性

11、项目中Service使用场景

通常用来做一些可后台进行的操作,如下载更新,上传文件,播放音乐等等。常用的推送也是基于Service实现的。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-02-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Android扫地僧 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档