美文网首页
Service基本

Service基本

作者: jeffrey12138 | 来源:发表于2020-10-07 11:54 被阅读0次

从这个文章开始,我就使用kotlin来进行编写,锻炼下自己对kotlin的熟悉程度,好啦,开始正文:
Service作为android在应用层的四大组件之一,我们也需要对他有一定的了解,我们都知道activity在销毁的时候,就完全停止运行了,但是Service可以继续在后台进行运作,所以耗时的操作基本都可以让Service去解决

而Service的生命周期与Activity的生命周期也有所不同,分为5个阶段:

//创建服务
    override fun onCreate() {
        super.onCreate()
    }
    //启动服务
    override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
        return super.onStartCommand(intent, flags, startId)
    }
    //绑定服务
    override fun onBind(intent: Intent): IBinder {
        TODO("Return the communication channel to the service.")
    }
    //解绑服务
    override fun onUnbind(intent: Intent?): Boolean {
        return super.onUnbind(intent)
    }
    //销毁服务
    override fun onDestroy() {
        super.onDestroy()
    }

然后有意思的一点来了
Service在启动服务的时候,会进行判断,目前服务是否存在,如不存在,则按照下面顺序进行:
onCreate() -- onStartCommand()
如果存在时候,不管你启动多少次,都知会调用一个方法:
onStartCommand()
在我们主动销毁服务的时候,就会调用onDestroy()
所以一般正常顺序是:
onCreate() -- onStartCommand()--onDestroy()
那绑定和解绑去哪里呢?
这个就要根据情况进行判断了:
①未启动服务的绑定情况:
onCreate()-- onBind(intent: Intent)
②未启动服务的解绑情况:
onUnbind(intent: Intent?)--onDestroy()
③在启动服务的绑定情况:
onCreate()--onStartCommand()-- onBind(intent: Intent)
④在启动服务的解绑情况:
onUnbind(intent: Intent?)
发现了没?在启动服务的情况下,解绑并不会回调onDestroy() ,除非是主动调用,这就很有意思了吧

后面就说下怎么使用吧:
在Service启动后,怎么样告诉前端发生了什么变化呢?
在我们绑定服务的时候,使用了一个类叫ServiceConnection

 private val con = object : ServiceConnection {
        override fun onServiceConnected(name: ComponentName?, service: IBinder?) {
            Log.e("TAG","66666")
            val mb=service as MyService.MyBind
            var step=mb.getProcess()
            Log.e("TAG","当前进度是:$step")
        }

        override fun onServiceDisconnected(name: ComponentName?) {
            TODO("Not yet implemented")
        }
    }

onServiceConnected是链接成功时所调用的,而onServiceDisconnected是链接失败时所调用的
其中注意IBinder这个类,在我们MyService调用onBind的方法的时候,返回的也是IBinder这个类,然后点开这个类之后,就会发现,里面有一堆方法需要时候,但是我们在实际开发的时候,只想调用自己所使用到的类去进行开发,这个时候,就可以看下Binder这个类了,进去看下Binder类的时候,就会发现,他已经实现了所有IBinder类中需要实现的方法。
所以,我们可以自己定义一个类去继承Binder类,然后通过返回Binder类去告知前端怎么操作,例子如下:

private var i = 0
    override fun onCreate() {
        Log.e("TAG", "onCreate")
        //开启一个线程(从1数到100),用于模拟耗时的任务
        object : Thread() {
            override fun run() {
                super.run()
                try {
                    i = 1
                    while (i <= 100) {
                        sleep(100)
                        i++
                    }
                } catch (e: Exception) {
                    e.printStackTrace()
                }
            }
        }.start()
    }

    override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
        Log.e("TAG", "onStartCommand")
        return super.onStartCommand(intent, flags, startId)
    }
    override fun onBind(intent: Intent): IBinder {
        Log.e("TAG", "onBind")
        return MyBind()

    }
    inner class MyBind :Binder(){
        fun getProcess(): Int {
            return i
        }
    }

好啦!!!果然使用kotlin语法去学习新的框架或者组件的时候,会加深对kotlin的理解,这就很棒!!!

相关文章

网友评论

      本文标题:Service基本

      本文链接:https://www.haomeiwen.com/subject/lqhtuktx.html