美文网首页
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生命周期

    前言 在上节,我们学习了Lifecycle解耦Activity/Fradgment的知识,大家有兴趣的话,可参考L...

  • 2.3 使用LifecycleService解藕Service

    2.3.1LifecycleService 基本介绍 在上文中,我们介绍了如何利用LifeCycle来监听页面的生...

  • Android-Jetpack-LifeCycle组件的使用

    在软件开发当中,解耦可能是永恒的话题。Android开发当中的解耦体现在系统组件的生命周期和普通组件之间的解耦,L...

  • 前端请求二进制流文件

    需求:在前(web client)后(Restful Service)端完全解耦的模式框架下,webclient需...

  • SPI机制

    SPI的全名为Service Provider Interface,是Java实现面向接口的解耦机制。通过SPI,...

  • LifeCircle使用

    MVP可以使用LifeCircle解耦。不用在Activity生命周期中再调用Presenter的生命周期回调。P...

  • android LifeCycle解耦service 组件

    前言:各位同学大家好,相信各位同学在开发安卓的时候都有用过四大组件之一的service吧 今天我们就通过一个获取...

  • 组件化-BeeHive

    解耦 BeeHive的核心主要有两类对象,一类是Service对象,第二类是Module对象。Service解除依...

  • Java Service Provider Interface(

    组件中最常用的解耦及扩展机制的基石头。 什么是Service? Service是一组知名的接口和类(类通常都是抽象...

  • Glide(一)生命周期绑定

    Glide 的解耦方式很独特。 相关文章:Fragment 如何跟Activity的生命周期进行绑定 1.1 Gl...

网友评论

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

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