背景任务Android Java,每X秒永久一次

背景任务Android Java,每X秒永久一次,java,android,background,Java,Android,Background,到目前为止,我一直在后台任务中使用“AlertManager”。这不再适用于新的Android版本。必须每15秒启动一次,并且在任何情况下都不得被系统停止。当手机重新启动时,后台任务也必须启动。现在,后台任务只启动一次,然后就什么也没有发生 有解决办法吗 我就是这样计划我的任务的: MainActivity.java AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE)

到目前为止,我一直在后台任务中使用“AlertManager”。这不再适用于新的Android版本。必须每15秒启动一次,并且在任何情况下都不得被系统停止。当手机重新启动时,后台任务也必须启动。现在,后台任务只启动一次,然后就什么也没有发生

有解决办法吗

我就是这样计划我的任务的:

MainActivity.java

AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
Intent startServiceIntent = new Intent(context, hintergrundModus.class);
PendingIntent startServicePendingIntent = PendingIntent.getService(context,0,startServiceIntent,0);
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
if(alarmManager != null)
alarmManager.set(AlarmManager.RTC_WAKEUP,hintergrundModus.timeHintergrundmodus,startServicePendingIntent);

对于较新版本的Android,您需要用
androidx.core.app.JobIntentService
替换不推荐使用的
IntentService
。(不要忘记删除
IntentService#onBind(Intent)
的实现,否则您的服务将永远无法启动)

类hintergrundModus扩展了IntentService
@凌驾
受保护的IBinder onBind(意图arg0){
返回空
}
@凌驾
受保护的无效onHandleIntent(意图arg0){
...
}
}
将成为

导入androidx.core.app.JobIntentService;
类hintergrundModus扩展了JobIntentService{
@凌驾
手工制品上的公共无效(意图arg0){
...
}
}
对于
AlarmManager
,您也不再使用
PendingEvent#getService
直接调用您的服务,而是创建一个中介
BroadcastReceiver
,在调用时可以将您的工作排队

导入静态androidx.core.app.JobIntentService.enqueueWork;
公共类ServiceLaunchReceiver扩展了BroadcastReceiver{
公共静态最终字符串接收器\u KEY=“com.package.ACTION”;
公共静态final int UNIQUE_JOB_ID=0;
@凌驾
公共void onReceive(上下文、意图){
if(intent.getAction().equals(RECEIVER_KEY)){
排队工作(上下文、hintergrundModus.class、唯一的作业ID、意图);
}
}
}
然后可由
pendingent#getBroadcast

Intent-launcherveiverintent=新的Intent(上下文,ServiceLaunchReceiver.class);
PendingEvent StartServicePendingEvent=PendingEvent.getBroadcast(上下文,0,launcherReceiverIntent,0);
如果需要重复的计时精度,您可能还需要研究在运行API 19或更高版本的设备上使用
AlarmManager#setExact
AlarmManager#setExactAndAllowHileidle
。然后,您可以在
JobIntentService
中的工作完成后安排后续报警,而不是安排重复报警。根据
AlarmManager#set
上的此说明:

从API 19开始,传递给此方法的触发时间被视为不精确:在此时间之前不会发出警报,但可能会延迟并在一段时间后发出

您还将发现,当涉及到终止后台应用程序时,较新版本的Android可能非常具有攻击性。由于您的服务似乎是短期的,因此将其绑定到前台通知(通过
startForeground(Int,notification)
)可能不适合您。在这种情况下,您可能需要在运行时向用户请求电池优化排除,以避免系统限制


最后,在用于收听系统启动通知的
BroadcastReceiver
中,实现上述代码,使新的
JobIntentService
排队,或安排第一次报警推迟到以后。

对于较新版本的Android,您需要将
IntentService
的不推荐用法替换为
androidx.core.app.JobIntentService
。(不要忘记删除
IntentService#onBind(Intent)
的实现,否则您的服务将永远无法启动)

类hintergrundModus扩展了IntentService
@凌驾
受保护的IBinder onBind(意图arg0){
返回空
}
@凌驾
受保护的无效onHandleIntent(意图arg0){
...
}
}
将成为

导入androidx.core.app.JobIntentService;
类hintergrundModus扩展了JobIntentService{
@凌驾
手工制品上的公共无效(意图arg0){
...
}
}
对于
AlarmManager
,您也不再使用
PendingEvent#getService
直接调用您的服务,而是创建一个中介
BroadcastReceiver
,在调用时可以将您的工作排队

导入静态androidx.core.app.JobIntentService.enqueueWork;
公共类ServiceLaunchReceiver扩展了BroadcastReceiver{
公共静态最终字符串接收器\u KEY=“com.package.ACTION”;
公共静态final int UNIQUE_JOB_ID=0;
@凌驾
公共void onReceive(上下文、意图){
if(intent.getAction().equals(RECEIVER_KEY)){
排队工作(上下文、hintergrundModus.class、唯一的作业ID、意图);
}
}
}
然后可由
pendingent#getBroadcast

Intent-launcherveiverintent=新的Intent(上下文,ServiceLaunchReceiver.class);
PendingEvent StartServicePendingEvent=PendingEvent.getBroadcast(上下文,0,launcherReceiverIntent,0);
如果需要重复的计时精度,您可能还需要研究在运行API 19或更高版本的设备上使用
AlarmManager#setExact
AlarmManager#setExactAndAllowHileidle
。然后,您可以在
JobIntentService
中的工作完成后安排后续报警,而不是安排重复报警。根据
AlarmManager#set
上的此说明:

从API 19开始,传递给此方法的触发时间被视为不精确:在此时间之前不会发出警报,但可能会延迟并在一段时间后发出

你也会发现新版本的Android非常有攻击性