如何在不是 Activity 的简单类中设置位置
Posted
技术标签:
【中文标题】如何在不是 Activity 的简单类中设置位置【英文标题】:How to setup location in a simple class that is not an Activity 【发布时间】:2020-01-24 19:17:41 【问题描述】:我正在使用FusedLocationProviderClient
从一个不是活动的简单类中获取用户位置。我怎样才能做到这一点?我不想从活动类中获取位置,只是从一个简单的类中获取。可能吗?示例如下
class GetUserLocation
private lateinit var fusedLocationClient: FusedLocationProviderClient
suspend fun getLastLocation(): Map<String, Double>
fusedLocationClient = LocationServices.getFusedLocationProviderClient(this)
val location = fusedLocationClient.lastLocation.await()
return mapOf(
"lat" to location.latitude,
"lng" to location.longitude
)
如果我不在活动类中,我如何在以下 sn-p 中获得 this
,因为以下 sn-p 需要活动,this
仅指 GetUserLocation
类因此错误
fusedLocationClient = LocationServices.getFusedLocationProviderClient(this)
【问题讨论】:
【参考方案1】:您只需将上下文传递到您想从设备获取当前位置的任何地方。
创建一个提供上下文的应用模块
@Module
class ApplicationModule(var app: App)
@Provides
@Singleton
fun provideApp(): App = app
@Provides
@Singleton
fun provideContext(): Context = app.applicationContext
并创建一个组件
@Singleton
@Component(modules = arrayOf(ApplicationModule::class))
interface ApplicationComponent
fun context(): Context
最后你应该创建一个组件实例
val component by lazy
DaggerApplicationComponent.builder()
.applicationModule(ApplicationModule(this))
.build()
class LocationUtils(app: Application)
@Inject
lateinit var context: Context
init
(app as? App)?.component?.inject(this)
fusedLocationClient = LocationServices.getFusedLocationProviderClient(context)
【讨论】:
问题是该类是从与任何活动类没有连接的 repo 类中调用的。唯一的选择是将上下文从活动类传递给三个类,例如“HomeActivity -> Viewmodel -> RepoClass -> GetUserLocation Class”,这很不方便 好的,那么您应该将 App 实例或上下文注入您的 repo 类 这不是问题,您应该只在从 LocationServices 获取位置信息时处理活动生命周期 你需要在 onStart() 生命周期方法中开始监听位置,你应该在 onPause() 和 onStop() 方法中停止,你应该再次开始在活动的 onResume 中监听位置 为了能够处理这个循环,您可以实现developer.android.com/topic/libraries/architecture/lifecycle 以遵守活动的生命周期行为以上是关于如何在不是 Activity 的简单类中设置位置的主要内容,如果未能解决你的问题,请参考以下文章
Android如何在一个Activity中设置ActionBar