在 Android 5.0+ 中使用短间隔重复警报的正确方法是什么?

What is the correct way to use repeating alarms for short intervals in Android 5.0+?

所以我需要以非常短的频率(30 秒)将我当前位置的坐标发送到服务器。现在我正在使用 AlarmManager setRepeating(),但是 Android 5.0+ 允许最多 1 分钟的间隔以节省电池。

我的问题是:

我的方法真的有效吗?我需要在后台 运行 这个重复的警报,即使设备关闭也是如此。目前我正在执行 pendingintent,这会导致 broadcastreceiver 进而执行到 asynctasks,一个用于服务器身份验证,一个用于发布坐标。

Is my way really efficient?

没有。这就是 Android 5.1+ 不支持开箱即用的原因,这也是 Android 6.0 引入打盹模式的原因。

I need to run this repeating alarm in the background, even when the device is off.

我假设 "the device is off" 你的意思是 "the screen is off"。如果设备断电,您的代码将不会 运行.

您可以使用 setExact() 到 "manually" 以 30 秒为间隔执行您自己的重复事件,其中您对警报事件所做的工作包括安排下一个警报。当设备处于打瞌睡模式时,这在 Android 6.0+ 设备上也会失败。在 Android 6.0+ 上获得每 30 秒行为的唯一方法是用户将您的应用程序添加到设置中的电池优化白名单。

Currently I am executing the pendingintent which leads to a broadcastreceiver which in turn executes to asynctasks, one for server authentification, one for posting the coordinates.

首先,这不太可能是可靠的。您的进程可以在 onReceive() returns 后立即终止,因为 Android 认为您的工作已完成。

其次,AsyncTask 对于像广播这样的后台操作通常毫无意义。 AsyncTask 背后的全部要点是让您在后台工作结束时在主应用程序线程上工作,没有理由在后台在主应用程序线程上工作。由于这个和上面的原因,用一个IntentService来代替两个AsyncTasks.

第三,对于任何给定的警报事件,由于网络拥塞、服务器问题等原因,您很有可能无法在 30 秒内完成工作。您需要确保自己处理好这是适当的,这样你就不会结束对各种请求的排队(或者,在你当前的实现中,fork 很多并行的 AsyncTasks 都试图完成他们的工作)。