android - 即使在打瞌睡模式下也每 15 秒获取一次位置
问题描述
我想每 15 秒获取一次位置,一切正常,但是在打瞌睡模式(深度睡眠)下,我的处理程序无法正常工作,是吗?AlarmManager 是个好方法,但时间限制为 1 分钟,在打盹模式下不重复。
@ReactMethod
public static void setAlarm()
{
int interval = 50; // delay in secs
AlarmManager am = (AlarmManager) reactContext.getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(reactContext, AlarmManagerReceiver.class);
PendingIntent pi = PendingIntent.getBroadcast(reactContext, 0, intent, 0);
am.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), interval*1000 , pi);
}
接收者 :
public class AlarmManagerReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
DoRoutine();
}
}
解决方案
我想每 15 秒获取一次位置,一切正常
并不真地。
首先,不能保证您完全可以得到定位。例如,GPS 信号在室内或地下并不总是可用。
其次,不能保证您每 15 秒就会获得一次新的位置修复。例如,设备可能不会移动。
第三,在 Android 8.0+ 上,除非您的应用程序在前台,否则您不会经常获得位置修复。
但是在打盹模式(深度睡眠)下,我的处理程序无法正常工作,是吗?
步骤#1:希望用户将您的应用添加到电池优化白名单
第 2 步:使用前台服务
第 3 步:请求每 15 秒向您发送一次位置更新(例如,requestLocationUpdates()
在LocationManager
)
步骤#4:使用局部WakeLock
保持设备开机(即使屏幕关闭)
步骤#5:希望用户不要因为如此严重地耗尽电池而杀死你
推荐阅读
- javascript - 使用 axios.all 发送基本身份验证
- php - require_once 显示警告和致命错误,但在正确的目录中
- serialization - 在 OCaml 的 StdLib 中序列化“模块随机”的当前状态
- typescript - 如何让 CDK 仅创建一个弹性 IP 地址以用于单个 EC2 实例 (AWS CDK)
- javascript - Object.Assign 以数组形式返回值,要求以对象形式返回
- python - 用于用户登录的 Python 数据库连接
- node.js - 带有 ts 的 nodeJS :模块在本地声明组件,但未导出
- r - 如何在 Shiny 的另一个选项卡中呈现表格输出?
- java - Spring框架中的Spring IoC是服务定位器模式吗?
- java - 如何在 Hibernate 中打印带有值的选择查询