LifecycleService解耦Service生命周期

2022-08-05  本文已影响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流程如下:

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 具体操作

上一篇下一篇

猜你喜欢

热点阅读