我如何定期执行android位置检查?

问题描述 投票:3回答:1

我需要从android应用程序中检索android设备坐标,并将这些坐标发送给服务器,即使应用程序停止和/或设备处于睡眠状态也是如此。我需要以固定的时间间隔执行此操作。

我清楚地知道这是一个复杂的解决方案,但是您能否提及解决此问题所需的关键方面?在开发应用程序的过程中,我需要选择一个方向。

我已经在网络上进行了广泛的研究,有许多解决方案,但是其中一些似乎已经使用了几年,而另一些则倾向于以不同的方式解决特定的问题。不可能尝试所有这些内容,并从所有这些信息中组合出可以满足我的需求的解决方案,并且是最佳且稳定的解决方案。

谢谢

android service location
1个回答
2
投票

我遇到了同样的问题,该解决方案对我有用:

定义如下所示的工人:

class SendLocationWorker(
  context: Context,
  workerParams: WorkerParameters
) : Worker(context, workerParams) {
  private var retrofit: Retrofit? = null
  private var locationApi: MyApi? = null
  private val userLocationDao = AppDatabase.getInstance(applicationContext)
      .userLocationDao()

  override fun doWork(): Result {
    return try {
      if (retrofit == null) {
        retrofit = MasterRetrofit().initRetrofit(Constants.MAIN_URL)
      }
      if (locationApi == null) {
        locationApi = retrofit!!.create(MyApi::class.java)
      }
      callApi()
      Result.success()
    } catch (ex: Exception) {
      Result.failure()
    }
  }

  @SuppressLint("CheckResult")
  private fun callApi() {
    val locations = getUserLocations()
    if (locations.isNotEmpty()) {
      val request = InsertLocationUserRequest()
      request.saveTrackings = locations

      locationApi!!.SaveTracking(request)
          .subscribeOn(Schedulers.io())
          .observeOn(AndroidSchedulers.mainThread())
          .map(SuccessMapper<Response<InsertLocationUserResponse>>())
          .subscribe(
              { response ->
                if (response.body()!!.success) {
                  Observable.fromIterable(locations)
                      .forEach { location -> location.isSync = true }
                  userLocationDao.update(locations)
                }
              },
              { throwable ->

              },
              {
              }
          )
    }
  }

  private fun getUserLocations(): List<UserLocation> {
    return userLocationDao.findAll("isSync", "0")
  }
}

此外,您需要像这样在MasterActivity或MasterPresenter中定义一个方法:

  @Override public void sendStoredLocationToServer() {
    Constraints myConstraints = new Constraints.Builder()
        .setRequiresBatteryNotLow(true)
        .build();

    PeriodicWorkRequest sendLocationWorkerRequest =
        new PeriodicWorkRequest.Builder(SendLocationWorker.class, 10000, TimeUnit.MILLISECONDS)
            .setConstraints(myConstraints)
            .build();

    WorkManager.getInstance().enqueueUniquePeriodicWork("sendLocationWorker",
        ExistingPeriodicWorkPolicy.REPLACE,
        sendLocationWorkerRequest);
  }

然后您可以在任何需要的地方通过MasterActivity或MasterPresenter致电您的工作人员:

sendStoredLocationToServer();

该工作人员将您的位置保存在数据库中,并在可能的情况下将其发送,并将所有发送项目标记为true(使用isSyns标志)。

这个想法对我来说很有效。

© www.soinside.com 2019 - 2024. All rights reserved.