Android jetpack LifeCycle 在Services中的应用

这个需要添加依赖

简单添加

build.gralde 中

    implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0'

复杂点。

选中点击F4

 

 然后按照从左上到右下一个箭头一个箭头的看

搜索androidx.lifecycle选中这个 androidx.lifecycle-extensions

即可

我们通过服务来进行位置监听这样的一个demo来对 监听服务来进行一个学习

其中要模拟修改位置、建议用android studio自带的 低版本的模拟器 我用的 是api 24 也就是Android7.0

要不然根本没法模拟诶

首先服务与页面不同。

他需要这些东西

先写页面 

package com.anguomob.jecpack.activity

import android.Manifest
import android.content.Intent
import android.content.pm.PackageManager
import android.os.Build
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.view.View
import androidx.core.app.ActivityCompat
import com.anguomob.jecpack.R
import com.anguomob.jecpack.services.MyLocationServices

class GPSDetaultActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_gpsdetault)
        if (ActivityCompat.checkSelfPermission(
                this,
                Manifest.permission.ACCESS_FINE_LOCATION
            ) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(
                this,
                Manifest.permission.ACCESS_COARSE_LOCATION
            ) != PackageManager.PERMISSION_GRANTED
        ) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                requestPermissions(
                    arrayOf(
                        Manifest.permission.ACCESS_FINE_LOCATION,
                        Manifest.permission.ACCESS_COARSE_LOCATION
                    ),
                    1
                )
            }
        }
    }

    fun startGPS(view: View) {
        startService(Intent(this, MyLocationServices::class.java))
    }

    fun endGPS(view: View) {
        stopService(Intent(this, MyLocationServices::class.java))
    }
}

进来申请位置权限

    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

然后提供了开启和关闭按钮来对服务进行开启和关闭

<?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=".activity.GPSDetaultActivity">

    <Button
        android:id="@+id/button"
        android:onClick="startGPS"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="开始"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.532"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.344" />

    <Button
        android:id="@+id/button2"
        android:onClick="endGPS"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="86dp"
        android:text="停止"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.532"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="@+id/button"
        app:layout_constraintVertical_bias="0.37" />
</androidx.constraintlayout.widget.ConstraintLayout>

下面就到服务这里来了

package com.anguomob.jecpack.services

import android.util.Log
import androidx.lifecycle.LifecycleService
import com.anguomob.jecpack.observer.MyLocationObserver

class MyLocationServices : LifecycleService() {
    private val TAG = "MyLocationServices"

    init {
        Log.e(TAG, ":MyLocationServices init server ")
        val observer = MyLocationObserver(this)

        lifecycle.addObserver(observer)
    }
}

继承

LifecycleService 

重写一个观察者方法

我们来看这个观察者方法

package com.anguomob.jecpack.observer

import android.Manifest
import android.content.Context
import android.content.pm.PackageManager
import android.location.Location
import android.location.LocationListener
import android.location.LocationManager
import android.util.Log
import androidx.core.app.ActivityCompat
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.LifecycleObserver
import androidx.lifecycle.OnLifecycleEvent
import com.anguomob.jecpack.listener.MyLocationListener

class MyLocationObserver(val context: Context) : LifecycleObserver {
    lateinit var listener: LocationListener
    lateinit var locationManager: LocationManager
    private val TAG = "MyLocationObserver"

    @OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
    private fun startGetLocation() {
        Log.e(TAG, "startGetLocation")
        locationManager = context.getSystemService(Context.LOCATION_SERVICE) as LocationManager
        //每3秒获取一次位置
        listener = MyLocationListener();
        if (ActivityCompat.checkSelfPermission(
                context,
                Manifest.permission.ACCESS_FINE_LOCATION
            ) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(
                context,
                Manifest.permission.ACCESS_COARSE_LOCATION
            ) != PackageManager.PERMISSION_GRANTED
        ) {

            return
        }
        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 1f, listener)
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
    private fun stopGetLocation() {
        Log.e(TAG, "stopGetLocation")

        if (::locationManager.isInitialized) {
            locationManager.removeUpdates(listener)
        }
    }


}

这观察者我们学完acititity的组件监听已经很明了了吧

LifecycleObserver 这个我们在上面就使用过了

Android jetpack LifeCycle 在Ativity中的应用_安果移不动的博客-CSDN博客

所以也好理解

这里位置监听又是一个类。啊 我好累

package com.anguomob.jecpack.listener

import android.location.Location
import android.location.LocationListener
import android.util.Log

class MyLocationListener : LocationListener {
        private val TAG = "MyLocationListener"

        override fun onLocationChanged(p0: Location) {
            Log.e(TAG, "onLocationChanged: ${p0}")
        }




    }

好了 运行代码后

点击开始后可能由于模拟器原因会闪退 多试几次就好了

打印了位置

 使用adb devices 可以查看模拟器的 id

 执行这里两句

adb -s emulator-5554 emu geo fix 121.4961236714487 31.24010934431376
adb -s emulator-5554 emu geo fix 122.4961236714487 31.24010934431376

 位置会发生变化 并通知给我们 关闭服务后则不会变化

这就说明了那个。。简洁的通时。让很多地方调用成为了可能性。

比如那个页面想要直接监听位置变化操作并且与activity直接绑定。而不是通过点击按钮的方式

。回顾下上节课 我们应该如何操作呢?

非常简单

判断其权限给没给 并调用

 lifecycle.addObserver(MyLocationObserver(this))

猜你喜欢

转载自blog.csdn.net/mp624183768/article/details/124834109