0%

Service入门

Service是一种可以在后台执行长时间运行操作而不提供界面的应用组件。

服务类型

前台

后台

绑定

服务和线程

服务在其托管进程的主线程中运行,它既不创建自己的线程,也不在单独的进程中运行(除非另行指定)。所以如果需要在服务中执行CPU密集操作或阻塞式操作,则需要在服务中创建新的线程来完成。

基础

在清单文件中声明服务

1
2
3
4
5
6
7
<manifest ... >
...
<application ... >
<service android:name=".ExampleService" />
...
</application>
</manifest>

AS 创建服务时,会在清单文件中帮我们自动声明。

新建启动服务

新建启动服务,即实现一个自定义的Service子类。

可以通过继承Service 类或IntentService类实现。

继承Service

继承IntentService

启动服务

启动服务,通过一个组件调用startService()来实现,这会调用服务的onStartCommand()

1
2
3
Intent(this, HelloService::class.java).also { intent ->
startService(intent)
}

停止服务

新建绑定服务

绑定服务允许应用组件通过调用 bindService() 与其绑定,从而创建长期连接。

前台服务

前台服务必须在状态栏显示通知。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
val pendingIntent: PendingIntent =
Intent(this, ExampleActivity::class.java).let { notificationIntent ->
PendingIntent.getActivity(this, 0, notificationIntent, 0)
}

val notification: Notification = Notification.Builder(this, CHANNEL_DEFAULT_IMPORTANCE)
.setContentTitle(getText(R.string.notification_title))
.setContentText(getText(R.string.notification_message))
.setSmallIcon(R.drawable.icon)
.setContentIntent(pendingIntent)
.setTicker(getText(R.string.ticker_text))
.build()

startForeground(ONGOING_NOTIFICATION_ID, notification)

服务的生命周期

服务从创建到销毁的生命周期可遵循以下任一路径:

  • 启动服务

    该服务在其它组件调用startService()来启动,或者服务通过调用stopSelf()来自行停止或者其它组件通过调用stopService()来停止。服务停止后,系统会将其销毁。

  • 绑定服务

    该服务在其他组件(客户端)调用 bindService() 时创建。然后,客户端通过 IBinder 接口与服务进行通信。客户端可通过调用 unbindService() 关闭连接。多个客户端可以绑定到相同服务,而且当所有绑定全部取消后,系统即会销毁该服务。(服务不必自行停止运行。)

两条路径并非完全独立。

实现生命周期回调

参考

服务概览

2020-3-12 23:29:08