如何在不是 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 的简单类中设置位置的主要内容,如果未能解决你的问题,请参考以下文章

如何在 listView 中设置最终滚动的位置?

是否可以在片段类中设置 ViewPager?

Android如何在一个Activity中设置ActionBar

如何在 Activity Result API 中设置请求代码?

如何在 C# 中的控制台应用程序中设置鼠标光标的位置?

如何在 3D pyqtgraph 实现中设置 GLMeshItem 的绝对位置