美文网首页
LifecycleService解耦Service生命周期

LifecycleService解耦Service生命周期

作者: 奔跑的佩恩 | 来源:发表于2022-08-05 09:09 被阅读0次

    前言

    在上节,我们学习了Lifecycle解耦Activity/Fradgment的知识,大家有兴趣的话,可参考
    Lifecycle的使用
    这节让我们来学习下LifecycleService解耦Service生命周期的相关知识。
    今天涉及知识有:

    1. LifecycleServiceService
    2. LifecycleService引用依赖
    3. LifecycleService解耦Service流程
    4. LifecycleService解耦Service具体操作

    一. LifecycleService 及 Service

    使用LifecycleService与使用Lifecycle的缘由是一样的,都是为了将逻辑代码从生命中期中剥离出来。只不过Lifecycle针对的是Activity/Fradgment,而LifecycleService针对的是Service
    需要注意的点是,查看源码,我们可以发现:

    public class LifecycleService extends Service implements LifecycleOwner {
    

    LifecycleService继承自Service, 即LifecycleService就是一个Service。接着往里看:

    public abstract class Service extends ContextWrapper implements ComponentCallbacks2,
            ContentCaptureManager.ContentCaptureClient 
    

    发现Service继承自ContextWrapper,点击ContextWrapper查看:

    public class ContextWrapper extends Context {
    

    可以看到ContextWrapper继承自Context,即说明Service是一个Context实例,LifecycleService也是一个Context

    二. LifecycleService 引用依赖

    app_module对应的build.gradle中添加依赖:

    dependencies {
        // Java 8支持的 DefaultLifecycleObserver
        implementation "androidx.lifecycle:lifecycle-common-java8:2.3.1"
        // 实现Service的LifecycleOwner
        implementation "androidx.lifecycle:lifecycle-service:2.3.1"
       //其他代码省略 
       //......
    }
    

    三. LifecycleService 解耦 Service 流程

    LifecycleService解耦Service流程如下:

    • 先继承LifecycleService实现自己的Service
    • 实现DefaultLifecycleObserver写一个监听类,然后在自己的Service中添加监听类的监听
    • 将原需要捆绑到Service生命周期中的业务逻辑迁移到自己的监听类中处理
      下面贴出定位服务功能MyLocationServiceMainActivity中使用代码:
    package com.ktdemo.ui
    
    import android.content.Intent
    import android.os.Build
    import android.os.Bundle
    import android.view.View
    import androidx.annotation.RequiresApi
    import androidx.appcompat.app.AppCompatActivity
    import com.ktdemo.R
    import com.ktdemo.databinding.ActivityMainBinding
    import com.ktdemo.function.MyLocationService
    import com.ktdemo.util.LogUtil
    
    @RequiresApi(Build.VERSION_CODES.N)
    class MainActivity : AppCompatActivity(), View.OnClickListener {
    
        private lateinit var mBingding: ActivityMainBinding
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            mBingding = ActivityMainBinding.inflate(layoutInflater)
            setContentView(mBingding.root)
    
            initData()
            setListener()
        }
    
        private var initData = {
            mBingding.tvName.text = "我是谁"
    
        }
    
        private var setListener = {
            LogUtil.i("====setListener=====")
    
            mBingding.mBtnStart.setOnClickListener(this)
            mBingding.mBtnStop.setOnClickListener(this)
        }
    
        override fun onClick(v: View) {
            when (v.id) {
                R.id.mBtnStart -> {
                    LogUtil.i("====开始=====")
                    startGps()
                }
                R.id.mBtnStop -> {
                    LogUtil.i("====结束=====")
                    stopGps()
                }
                else -> {
    
                }
            }
        }
    
        /**启动gps**/
        private var startGps={
            startService(Intent(this@MainActivity,MyLocationService::class.java))
            LogUtil.toast("启动gps")
        }
    
        /**停止gps**/
        private var stopGps={
            stopService(Intent(this@MainActivity,MyLocationService::class.java))
            LogUtil.toast("停止gps")
        }
    
        override fun onDestroy() {
            stopGps()
            super.onDestroy()
        }
    
    }
    
    

    MainActivity对应布局文件activity_main.xml代码如下:

    <?xml version="1.0" encoding="utf-8"?>
    <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".ui.MainActivity">
    
        <TextView
            android:id="@+id/tv_name"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Hello World!"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintVertical_bias="0.08" />
    
        <Button
            android:id="@+id/mBtnStart"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="30dp"
            android:text="开始"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/tv_name" />
    
        <Button
            android:id="@+id/mBtnStop"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="30dp"
            android:text="停止"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/mBtnStart" />
    
    </androidx.constraintlayout.widget.ConstraintLayout>
    

    运行效果图如下:


    2.gif

    项目结构图如下:


    1659623858.jpg

    四. LifecycleService 解耦 Service 具体操作

    相关文章

      网友评论

          本文标题:LifecycleService解耦Service生命周期

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