我需要创建一个应用来跟踪用户位置。该位置必须每隔一分钟发送到服务器一次(这会延迟问题)。但是我要设置一个永久存在的任务/服务时遇到很多麻烦(即使我关闭了应用程序或重新启动了系统)
*获取“最后位置”不是问题,唯一的问题是拥有“永远”运行的任务/服务)
我尝试使用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()
}
}
答案 0 :(得分:0)
使用AlarmManager并每分钟运行一次,以将您的请求发送到服务器。
https://developer.android.com/reference/android/app/AlarmManager
答案 1 :(得分:0)
好吧,我告诉你一个主意:
1。在前台/后台运行您的服务:您可以使用前台服务,该服务旨在始终运行,它附加在通知栏上,如果用户取消通知,该服务将终止,android将永远不会如果用户不知道该服务,则可以让它永远运行。
2。重新启动后运行服务:为了在重新启动后运行此服务,您将需要使用广播接收器来处理该系统事件。因此,重新启动完成后,您需要致电前台服务。
这是您必须遵循的路线图。请记住,您将需要用户权限才能进行位置更新。并且,根据SDK版本的不同,每个代码,方法和特殊需求也会有所不同。