Service
是一种可以在后台执行长时间运行操作而不提供界面的应用组件。
服务类型
前台
后台
绑定
服务和线程
服务在其托管进程的主线程中运行,它既不创建自己的线程,也不在单独的进程中运行(除非另行指定)。所以如果需要在服务中执行CPU密集操作或阻塞式操作,则需要在服务中创建新的线程来完成。
基础
在清单文件中声明服务
<manifest ... >
...
<application ... >
<service android:name=".ExampleService" />
...
</application>
</manifest>
AS 创建服务时,会在清单文件中帮我们自动声明。
新建启动服务
新建启动服务,即实现一个自定义的Service
子类。
可以通过继承Service
类或IntentService
类实现。
继承Service
继承IntentService
启动服务
启动服务,通过一个组件调用startService()
来实现,这会调用服务的onStartCommand()
。
Intent(this, HelloService::class.java).also { intent ->
startService(intent)
}
停止服务
新建绑定服务
绑定服务允许应用组件通过调用 bindService()
与其绑定,从而创建长期连接。
前台服务
前台服务必须在状态栏显示通知。
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