android开发,使用kotlin学习Service

简介: android开发,使用kotlin学习Service
  1. 服务简介

服务是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")
    }
}

 

目录
相关文章
|
26天前
|
Java Kotlin
Kotlin学习教程(七)
《Kotlin学习教程(七)》主要介绍了Lambda表达式,这是一种匿名函数,广泛用于简化代码。文章通过与Java 8 Lambda表达式的对比,展示了Kotlin中Lambda的基本语法、参数声明、函数体定义及如何作为参数传递。示例包括按钮事件处理和字符串比较,突出了Lambda表达式的简洁性和实用性。
35 4
|
28天前
|
Java Kotlin 索引
Kotlin学习教程(三)
Kotlin学习教程(三)
17 4
|
28天前
|
Java Kotlin
Kotlin学习教程(二)
Kotlin学习教程(二)
35 4
|
28天前
|
安全 Java 编译器
Kotlin学习教程(一)
Kotlin学习教程(一)
36 4
|
28天前
|
存储 Java API
Kotlin学习教程(六)
《Kotlin学习教程(六)》介绍了Kotlin中的注解、反射、扩展函数及属性等内容。注解用于添加元数据,反射支持运行时自省,扩展则允许为现有类添加新功能,无需修改原类。本文还详细解释了静态扩展的使用方法,展示了如何通过companion object定义静态部分,并对其进行扩展。
16 2
|
28天前
|
存储 设计模式 JSON
Kotlin学习教程(五)
《Kotlin学习教程(五)》介绍了Kotlin中的泛型、嵌套类、内部类、匿名内部类、枚举、密封类、异常处理、对象、单例、对象表达式、伴生对象、委托等高级特性。具体内容包括泛型的定义和类型擦除、嵌套类和内部类的区别、匿名内部类的创建、枚举类的使用、密封类的声明和用途、异常处理机制、对象和单例的实现、对象表达式的应用、伴生对象的作用以及类委托和属性委托的使用方法。通过这些内容,读者可以深入理解Kotlin的高级特性和设计模式。
16 1
|
29天前
|
存储 前端开发 测试技术
Android kotlin MVVM 架构简单示例入门
Android kotlin MVVM 架构简单示例入门
28 1
|
1月前
|
JavaScript Java Kotlin
Kotlin开发笔记 - 常量与变量
Kotlin开发笔记 - 常量与变量
30 2
|
1月前
|
JavaScript Java Kotlin
|
1月前
|
IDE 开发工具 Kotlin
Kotlin开发笔记 - 参数与异常
本教程详细讲解Kotlin语法,适合深入学习。若需快速掌握,可参考“简洁”系列教程。内容涵盖具名参数、变长参数、默认参数、多返回值及异常处理等核心概念,助你高效编程。
19 1
下一篇
无影云桌面