我正在尝试创建应用程序,我需要每1,5,10分钟发送位置更新,依此类推。
当应用程序正在运行时,它可以正常工作,但当它进入 后台/睡眠模式 时,它无法正常工作。
我尝试了两种方法setRepeating/setInExactRepeating
,但它们都没有在后台模式下工作。
public static void startSensorAlaram(Context ctx, long minutes) {
AlarmManager alarmManager = (AlarmManager) ctx
.getSystemService(Context.ALARM_SERVICE);
// Alarm_Receiver is a broadcast receiver.
Intent intent = new Intent(ctx, Alaram_Receiver.class);
intent.setAction(Utility.SENSOR_ACTION);
PendingIntent pi = PendingIntent.getBroadcast(ctx, 1, intent, PendingIntent.FLAG_UPDATE_CURRENT);
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP,System.currentTimeMillis(),minutes,pi);
// alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), minutes, pi);
}
public static void stopAlaramSensor(Context ctx) {
Intent intent = new Intent(ctx, Alaram_Receiver.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(ctx, 1,
intent, 0);
AlarmManager alarmManager = (AlarmManager) ctx
.getSystemService(Context.ALARM_SERVICE);
alarmManager.cancel(pendingIntent);
}
Alarm Receiver - Broadcast receiver
public class Alaram_Receiver extends WakefulBroadcastReceiver {
private SharedPreferences sp;
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
sp = context.getSharedPreferences(Utility.SHARED_PREFS, 0);
if (intent.getAction().equalsIgnoreCase(Utility.SENSOR_ACTION)) {
if (sp.getBoolean("logged_in", false)) {
// context.startService(new Intent(context,SensorService.class));
startWakefulService(context,new Intent(context,SensorService.class));
} else
Utility.stopAlaramSensor(context);
}
}
}
Note:-
最低API版本为15,编译版本为23。
答案 0 :(得分:3)
有两个问题。
1)从Android API> = 19开始,您应该使用新的AlarmManager.setExact()
方法,而不是set()
或setRepeating()
。以下是官方文件的引用。
从API 19(KITKAT)开始,警报传递不准确:操作系统将会 移位警报以最小化唤醒和电池使用。有 新的API,以支持需要严格交付的应用程序 担保;请参阅setWindow(int,long,long,PendingIntent)和 setExact(int,long,PendingIntent)。
2)从Android 6.0开始,引入了深度睡眠模式,称为Doze
。
它旨在减少设备待机时的电池消耗。有这么多的限制,你在这种模式下可以做的非常有限。您需要使用新的AlarmManager.setExactAndAllowWhileIdle()
在您选择的时间以“打盹”模式启动警报。
有关打盹模式的更多信息,请访问Optimizing for Doze and App Standby