这个需要添加依赖

简单添加

build.gralde 中

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

复杂点。

选中点击F4

Android jetpack LifeCycle 在Services中的应用_xml

 

Android jetpack LifeCycle 在Services中的应用_android jetpack_02

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

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

即可

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

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

要不然根本没法模拟诶

首先服务与页面不同。

他需要这些东西

Android jetpack LifeCycle 在Services中的应用_xml_03

 

先写页面 

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))
}
}

进来申请位置权限

Android jetpack LifeCycle 在Services中的应用_android_04

 

<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 这个我们在上面就使用过了


 


所以也好理解

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

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}")
}




}

好了 运行代码后

Android jetpack LifeCycle 在Services中的应用_android jetpack_05

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

Android jetpack LifeCycle 在Services中的应用_java_06

打印了位置

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

Android jetpack LifeCycle 在Services中的应用_android_07

 

 执行这里两句

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

Android jetpack LifeCycle 在Services中的应用_java_08

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

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

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

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

非常简单

判断其权限给没给 并调用

Android jetpack LifeCycle 在Services中的应用_java_09

 

lifecycle.addObserver(MyLocationObserver(this))