- 服务简介
服务是Android中的四大组件之一,它能够长期在后台运行且不提供用户界面。即使用户切到另一应用程序,服务仍可以在后台运行。
2.服务的创建
(1)创建Service子类
class MyService : Service() {
override fun onBind(intent: Intent): IBinder {
TODO("Return the communication channel to the service.")
}
}
(2)在清单文件中配置
<service
android:name=".MyService"
android:enabled="true"
android:exported="true">
</service>
3.服务的启动方式
(1)通过startService()方法启动
当通过startService()方法启动服务时,需要自身调用stopSelf()方法或者其他组件调用stopService()方法时服务才能停止。
(2)通过bindService()方法启动
当使用bingService()方法启动服务时,需要调用unbindService()方法解除绑定之后就会被销毁。
(3)即调用startService()方法,又调用了bingService()方法
这种情况下,要同时调用stopService()和unbindService()方法。
4.Service的生命周期
- onCreate():第一次创建服务时执行的方法。
- onDestory():服务被销毁时执行的方法。
- onStartCommand():访问者通过startService(intent)启动,服务时执行的方法。
- onBind():使用bindService()方式启动服务调用的方法。
- onUnbind():解除绑定时调用的方法。
5.Activity和Service进行通信
Activity和Service之间的通信由IBinder负责,在Activity中,创建一个类实现ServiceConnection接口,并且在这个类中重写onServiceConnected方法(当Service被绑定时会回调这个方法)和onServiceDisconnected方法(Service的创建进程崩溃或者被杀掉才会调用),然后再绑定Service。
class MainActivity : AppCompatActivity() {
lateinit var myBinder:MyService.mBinder
private val connection=object :ServiceConnection{
override fun onServiceConnected(p0: ComponentName?, p1: IBinder?) {
myBinder=p1 as MyService.mBinder
myBinder.a()
}
override fun onServiceDisconnected(p0: ComponentName?) {
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val bindbutton:Button=findViewById(R.id.bindbutton)
val unbindbutton:Button=findViewById(R.id.unbindbutton)
bindbutton.setOnClickListener {
val intent=Intent(this,MyService::class.java)
bindService(intent,connection,Context.BIND_AUTO_CREATE)//绑定Service
}
unbindbutton.setOnClickListener {
unbindService(connection)//解绑Service
}
}
}
在Service中,需要创建一个类继承Binder,在onBind()方法中返回这个类的实例。
class MyService : Service() {
private val myBinder=mBinder()
class mBinder:Binder(){
fun a(){
Log.d("data","service")
}
}
override fun onBind(intent: Intent): IBinder {
return myBinder
}
override fun onCreate() {
super.onCreate()
Log.d("data","onCreate")
}
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
Log.d("data","onStartCommand")
return super.onStartCommand(intent, flags, startId)
}
override fun onDestroy() {
super.onDestroy()
Log.d("data","onDestroy")
}
}
6.实现前台Service
前台服务执行一些用户能注意到的操作。
代码如下:
需要先进行权限声明
<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
class MyService : Service() {
private val myBinder=mBinder()
class mBinder:Binder(){
fun a(){
Log.d("data","service")
}
}
override fun onBind(intent: Intent): IBinder {
return myBinder
}
override fun onCreate() {
super.onCreate()
Log.d("data","onCreate")
val manager=getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.O){
val channel=NotificationChannel("my_service","前台Service通知",NotificationManager.IMPORTANCE_DEFAULT)
manager.createNotificationChannel(channel)
}
val intent=Intent(this,MainActivity::class.java)
val pi=PendingIntent.getActivity(this,0,intent,0)
val notification=NotificationCompat.Builder(this,"my_service")
.setContentTitle("这是主题")
.setContentText("这是内容")
.setSmallIcon(R.drawable.ic_baseline_favorite_border_24)
.build()
startForeground(1,notification)
}
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
Log.d("data","onStartCommand")
return super.onStartCommand(intent, flags, startId)
}
override fun onDestroy() {
super.onDestroy()
Log.d("data","onDestroy")
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/95968.html