Android 报警管理器在API 23之后未按预期启动服务

Android 报警管理器在API 23之后未按预期启动服务,android,service,alarmmanager,backgroundworker,Android,Service,Alarmmanager,Backgroundworker,最近我将我的项目升级到26 Api级别。在那之后,报警经理不再为我工作了。我不知道问题出在哪里,但我猜当应用程序位于lolipop(>=M)以上所有设备的后台时,警报根本不起作用。我已经讨论了其他问题,并遵循了一些建议,如“唤醒接收者” 下面是我的代码和流程相同 脚本 -每15分钟设置一次重复报警。 Intent dil = new Intent(getApplicationContext(), LocationSyncTaskReceiver.class); Pend

最近我将我的项目升级到26 Api级别。在那之后,报警经理不再为我工作了。我不知道问题出在哪里,但我猜当应用程序位于lolipop(>=M)以上所有设备的后台时,警报根本不起作用。我已经讨论了其他问题,并遵循了一些建议,如“唤醒接收者”

下面是我的代码和流程相同

脚本 -每15分钟设置一次重复报警。

     Intent dil = new Intent(getApplicationContext(), LocationSyncTaskReceiver.class);
        PendingIntent dlpi = PendingIntent.getBroadcast(getApplicationContext(), 225566, dil, 0);
        AlarmManager am = (AlarmManager) getSystemService(Context.ALARM_SERVICE);

            lFreq = 15;

        if(Build.VERSION.SDK_INT>23)
            am.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP,(System.currentTimeMillis()+5 * 60 * 1000L),dlpi);
        else
            am.setRepeating(AlarmManager.RTC_WAKEUP, 5 * 60 * 1000L, lFreq * 60 * 1000L, dlpi);
-正在调用“WakefulBroadcastReceiver”。

  public class LocationSyncTaskReceiver extends WakefulBroadcastReceiver {

private static final String TAG = LocationSyncTaskReceiver.class.getSimpleName();

@Override
public void onReceive(Context context, Intent intent) {

    WakefulIntentService.acquireStaticLock(context);
    Intent locationSync = new Intent(context, SyncLocationTracker.class);
    startWakefulService(context,locationSync);
}
}

-上述代码正在调用“WakefulIntentService”-SyncLocationTracker

    @Override
public void doWakefulWork(Intent intent) {
    userService = UserServiceImpl.getInstance();
    Log.d(TAG, "Data Tracker : doWakefulWork called");
    if (userService.getLoggedInUser() != null) {
        Log.d(TAG, "User is logged in so continuing sync ....");
        WakefulIntentService.acquireStaticLock(getApplicationContext());
        syncService = DataSyncServiceImpl.getInstance();
        syncService.syncLocation();
    } else {
        Log.d(TAG, "User is not logged in so discarding sync ....");
        stopSelf();
    }
    stopSelf();
}

-'syncService.syncLocation();'最终正在执行一些计算和多个网络请求

更改您的if条件:

if(Build.VERSION.SDK_INT > 23)
致:


使用此库解决了此问题

它使用
JobScheduler
GcmNetworkManager
AlarmManager
,具体取决于您的android操作系统版本

Android Oreo的所有功能都向后兼容到冰淇淋三明治

JobRequest.Builder
类有许多额外的选项,例如,您可以指定所需的网络连接、定期执行作业、通过捆绑传递一些额外内容、在重新启动后恢复作业或在准确的时间运行作业

范例

     int jobId = new JobRequest.Builder(DemoSyncJob.TAG)
        .setExecutionWindow(30_000L, 40_000L)
        .setBackoffCriteria(5_000L, JobRequest.BackoffPolicy.EXPONENTIAL)
        .setRequiresCharging(true)
        .setRequiresDeviceIdle(false)
        .setRequiredNetworkType(JobRequest.NetworkType.CONNECTED)
        .setExtras(extras)
        .setRequirementsEnforced(true)
        .setUpdateCurrent(true)
        .build()
        .schedule();

您好,Uday这是我的答案,它可能会帮助您在DhavalSolanki正确启动报警,它在23以下工作,但不在23以上,我正在使用SetExactAndAllowHileidle仍然不工作Google更改了行为并在API级别23中引入了“Doze”。API级别24有更多的限制。请参阅“是”,我知道,但系统将正常报警,如果需要设置在打瞌睡时触发的报警,请使用setAndAllowHileIDLE()或setExactAndAllowHileIDLE(),您可以阅读下面链接中的“打瞌睡限制”部分。
     int jobId = new JobRequest.Builder(DemoSyncJob.TAG)
        .setExecutionWindow(30_000L, 40_000L)
        .setBackoffCriteria(5_000L, JobRequest.BackoffPolicy.EXPONENTIAL)
        .setRequiresCharging(true)
        .setRequiresDeviceIdle(false)
        .setRequiredNetworkType(JobRequest.NetworkType.CONNECTED)
        .setExtras(extras)
        .setRequirementsEnforced(true)
        .setUpdateCurrent(true)
        .build()
        .schedule();