每分钟发送一次发送位置的服务,即使应用程序处于后台运行或系统重新启动

时间:2019-08-08 22:51:01

标签: android service androidx

我需要创建一个应用来跟踪用户位置。该位置必须每隔一分钟发送到服务器一次(这会延迟问题)。但是我要设置一个永久存在的任务/服务时遇到很多麻烦(即使我关闭了应用程序或重新启动了系统)

*获取“最后位置”不是问题,唯一的问题是拥有“永远”运行的任务/服务)

我尝试使用Service。但是,从棉花糖(我猜)版本开始,Android可以随时终止后台应用程序和服务(它的功能是避免许多应用程序创建后台服务/任务并消耗过多的电池和内存)。

现在,我想使用新的androidx“ Worker”,因为我想用minSdk = 16和当前的maxSdk(29)来构建一个应用程序。但是现在我面临两个问题: -工人不能运行超过10分钟(因此我无法创建可以永久使用的工人)。 -我可以创建一个PeriodicWorkRequest,但是重新安排Worker的最短时间为15分钟(我需要每1分钟发送一次位置)。

我尝试使用OneTimeWorkRequest并重新安排自身的时间,但是在系统重启后无法正常工作。

有什么想法/解决方案吗?

主要活动中的第一个时间表:

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        WorkManager.getInstance(this).enqueue(
            OneTimeWorkRequest.Builder(WorkerTest::class.java).build()
        )
    }
}

工人(在“ doWork”的初始位置进行重新安排,但要延迟一分钟):

public class WorkerTest(context: Context, workerParams: WorkerParameters) : Worker(context, workerParams) {

    override fun doWork(): Result {
        WorkManager.getInstance(applicationContext).enqueue(
            OneTimeWorkRequest.Builder(this::class.java).setInitialDelay(1, TimeUnit.MINUTES).build()
        )

        //TODO get and send location

        return Result.success()
    }

}

2 个答案:

答案 0 :(得分:0)

使用AlarmManager并每分钟运行一次,以将您的请求发送到服务器。

https://developer.android.com/reference/android/app/AlarmManager

答案 1 :(得分:0)

好吧,我告诉你一个主意:

1。在前台/后台运行您的服务:您可以使用前台服务,该服务旨在始终运行,它附加在通知栏上,如果用户取消通知,该服务将终止,android将永远不会如果用户不知道该服务,则可以让它永远运行。

2。重新启动后运行服务:为了在重新启动后运行此服务,您将需要使用广播接收器来处理该系统事件。因此,重新启动完成后,您需要致电前台服务。

这是您必须遵循的路线图。请记住,您将需要用户权限才能进行位置更新。并且,根据SDK版本的不同,每个代码,方法和特殊需求也会有所不同。