Kotlin Service服务组件开发详解

目录
  • 服务简介
  • 服务的创建
  • 服务的启动方式
  • Service的生命周期
  • Activity和Service进行通信
  • 实现前台Service

服务简介

服务是Android中的四大组件之一,它能够长期在后台运行且不提供用户界面。即使用户切到另一应用程序,服务仍可以在后台运行。

服务的创建

(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>

服务的启动方式

(1)通过startService()方法启动

当通过startService()方法启动服务时,需要自身调用stopSelf()方法或者其他组件调用stopService()方法时服务才能停止。

(2)通过bindService()方法启动

当使用bingService()方法启动服务时,需要调用unbindService()方法解除绑定之后就会被销毁。

(3)即调用startService()方法,又调用了bingService()方法

这种情况下,要同时调用stopService()和unbindService()方法。

Service的生命周期

  • onCreate():第一次创建服务时执行的方法。
  • onDestory():服务被销毁时执行的方法。
  • onStartCommand():访问者通过startService(intent)启动,服务时执行的方法。
  • onBind():使用bindService()方式启动服务调用的方法。
  • onUnbind():解除绑定时调用的方法。

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")
    }
}

实现前台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")
    }
}

到此这篇关于Kotlin Service服务组件开发详解的文章就介绍到这了,更多相关Kotlin Service内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Kotlin Service实现消息推送通知过程

    目录 建立Service 绑定服务 小结 四大组件,就剩下最后一个Service ,他比较重要,相当于后台服务,基本上大部分的app,都会有一两个这样的服务Service . Service用处非常的多,可以根据后台的特性来决定Service的用法. Service 的使用也非常的简单,简单的建立和绑定,就能完成Service的动作. 建立Service 这里我们创建一个Service,用它来发送消息服务,这里从服务的建立和用Binder 来绑定服务,这样可以建立起Service 和Activi

  • Kotlin Service服务组件开发详解

    目录 服务简介 服务的创建 服务的启动方式 Service的生命周期 Activity和Service进行通信 实现前台Service 服务简介 服务是Android中的四大组件之一,它能够长期在后台运行且不提供用户界面.即使用户切到另一应用程序,服务仍可以在后台运行. 服务的创建 (1)创建Service子类 class MyService : Service() { override fun onBind(intent: Intent): IBinder { TODO("Return the

  • Vue 短信验证码组件开发详解

    Vue.js(读音 /vjuː/, 类似于 view)是一个构建数据驱动的 web 界面的库.Vue.js 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件. Vue.js 自身不是一个全能框架--它只聚焦于视图层.因此它非常容易学习,非常容易与其它库或已有项目整合.另一方面,在与相关工具和支持库一起使用时,Vue.js 也能完美地驱动复杂的单页应用. 摘要: 1.该组件基于Vue 2.1.X版本: 1. Vue 组件代码如下: Vue.component('timerBtn

  • Vue header组件开发详解

    一. header 组件开发 之数据的传递 1. App.vue 引入组件 import header from './components/header/header' 2. App.vue 中注册组件 export default { components:{ v-header:header } } 3. 使用组件 <v-header :sell="sellerObj"></v-header> 解释::sell="sellerObj",这

  • vue悬浮表单复合组件开发详解

    本文实例为大家分享了vue悬浮表单复合组件开发的具体代码,供大家参考,具体内容如下 组件样式 组件功能 卡片形式展示筛选条件点击添加筛选后展示悬浮表单表单内完成条件选择后点击保存,新增一个卡片 开发 <div class="form-label">筛选条件:</div> <template v-for="(item, index) in fitter">   <div :key="index" class

  • Vue框架之goods组件开发详解

    一. 布局 Flex Flex 布局,可以简便.完整.响应式地实现各种页面布局,Flex 是 Flexible Box 的缩写,意为"弹性布局",用来为盒状模型提供最大的灵活性.任何一个容器都可以指定为 Flex 布局. // 指定为 Flex 布局 display: flex: // 主要属性   flex: none | [ <'flex-grow'> <'flex-shrink'>? || <'flex-basis'> ]   flex属性是f

  • Vue shopCart 组件开发详解

    一.shopCart组件 (1) goods 父组件和 子组件 shopCart 传参 deliveryPrice:{ // 单价 从json seller 对象数据中获取 type:Number, default:0 }, minPrice:{ // 最低起送价 从json seller 对象数据中获取 type:Number, default:20 } 其中 deliveryPrice 和 minPrice 的数据都是从 data.json数据 中 seller 对象下 获得.所以在good

  • 微信小程序自定义tabBar组件开发详解

    本文实例为大家分享了微信小程序自定义tabBar组件的具体代码,供大家参考,具体内容如下 以下代码保存在github地址 先看一看目录 template文件夹里存放tabbar模板. template/template.wxml <template name="tabBar"> <view class="tabBar"> <block wx:for="{{tabBar}}" wx:for-item="ite

  • Android开发Kotlin实现圆弧计步器示例详解

    目录 效果图 定义控件的样式 自定义StepView 绘制文本坐标 Android获取中线到基线距离 效果图 定义控件的样式 看完效果后,我们先定义控件的样式 <!-- 自定义View的名字 StepView --> <!-- name 属性名称 format 格式 string 文字 color 颜色 dimension 字体大小 integer 数字 reference 资源或者颜色 --> <declare-styleable name="StepView&q

  • Android bindService的使用与Service生命周期案例详解

    Android中有两种主要方式使用Service,通过调用Context的startService方法或调用Context的bindService方法,本文只探讨纯bindService的使用,不涉及任何startService方法调用的情况.如果想了解startService相关的使用,请参见<Android中startService的使用及Service生命周期>. bindService启动服务的特点 相比于用startService启动的Service,bindService启动的服务

  • Vuejs 单文件组件实例详解

    在之前的实例中,我们都是通过 Vue.component 或者 components 属性的方式来定义组件,这种方式在很多中小规模的项目中还好,但在复杂的项目中,下面这些缺点就非常明显了: 字符串模板:缺乏高亮,书写麻烦,特别是 HTML 多行的时候,虽然可以将模板写在 html 文件中,但是侵入性太强,不利于组件解耦分离. 不支持CSS:意味着当 HTML 和 JavaScript 组件化时,CSS明显被遗漏了 没有构建步骤:限制只能使用 HTML 和 ES5 JavaScript,而不能使用

随机推荐