Android jetpack LifeCycle 在Services中的应用
Posted 安果移不动
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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))
创作打卡挑战赛
赢取流量/现金/CSDN周边激励大奖
以上是关于Android jetpack LifeCycle 在Services中的应用的主要内容,如果未能解决你的问题,请参考以下文章
Android Jetpack 之 Lifecycle - 2
Android Jetpack LifeCycle 实现原理分析
Android Jetpack LifeCycle 实现原理分析