Планировщик заданий не может отменить задания для системного uid - PullRequest
0 голосов
/ 26 июня 2018

Я получаю следующее исключение в logcat при попытке отменить все задания в моем приложении

06-26 11:27:54.866 E/JobSchedulerService( 1246): Can't cancel all jobs for system uid
06-26 11:27:54.866 E/JobSchedulerService( 1246): android.util.Log$TerribleFailure: Can't cancel all jobs for system uid
06-26 11:27:54.866 E/JobSchedulerService( 1246):    at android.util.Log.wtf(Log.java:299)
06-26 11:27:54.866 E/JobSchedulerService( 1246):    at android.util.Slog.wtfStack(Slog.java:98)
06-26 11:27:54.866 E/JobSchedulerService( 1246):    at com.android.server.job.JobSchedulerService.cancelJobsForUid(JobSchedulerService.java:788)
06-26 11:27:54.866 E/JobSchedulerService( 1246):    at com.android.server.job.JobSchedulerService$JobSchedulerStub.cancelAll(JobSchedulerService.java:2033)
06-26 11:27:54.866 E/JobSchedulerService( 1246):    at android.app.job.IJobScheduler$Stub.onTransact(IJobScheduler.java:119)
06-26 11:27:54.866 E/JobSchedulerService( 1246):    at android.os.Binder.execTransact(Binder.java:697)

Кто-нибудь тоже сталкивался с этой ошибкой? Кажется, я нигде не могу найти ответ.

Код для отмены заданий прост и выглядит следующим образом:

public static void cancelAllJobs(@NonNull Context context) {
    JobScheduler jobScheduler = (JobScheduler) context.getSystemService(Context.JOB_SCHEDULER_SERVICE);
    if (jobScheduler != null) {
        jobScheduler.cancelAll();
        Timber.d("All jobs are canceled.");
    } else {
        Timber.w("Job scheduler is not available.");
    }
}

Обратите внимание, , мое приложение объявлено как системное в манифесте с

android:sharedUserId="android.uid.system"

1 Ответ

0 голосов
/ 26 июня 2018

Если вы запустите: adb shell dumpsys jobscheduler, вы увидите все задания, запланированные в системном uid (# 1000).

Задание, запланированное для приложения с общим uid, должно гарантировать, что их идентификатор задания уникален среди всех пакетов, использующих этот общий uid. From docs: "Идентификатор должен быть уникальным для всех клиентов с одним и тем же uid (а не только с одним и тем же пакетом)." API cancelAll () отменяет все задания под вызывающим uid и не только задания из вызывающего пакета. Я полагаю, что Android ограничивает пакет с системным UID отменой всех системных UID-заданий, чтобы избежать непреднамеренного отмены заданий.

Вы действительно хотите отменить все задания из всех приложений / пакетов в системном uid?

У меня есть пара приложений, использующих jobscheduler с системным uid, и использую следующий код для отмены определенного задания.

public static void cancelJob(Context mContext, int jobID) {
    JobScheduler scheduler = (JobScheduler)
            mContext.getSystemService(Context.JOB_SCHEDULER_SERVICE);

    for (JobInfo jobInfo : scheduler.getAllPendingJobs()) {
        if (jobInfo.getId() == jobID) {
            scheduler.cancel(jobID);
            Log.i(TAG,"Cancelled Job with ID:" + jobID);
        }
    }
}

Еще один хороший пост, с которым я только что столкнулся: https://commonsware.com/blog/2017/06/07/jobscheduler-job-ids-libraries.html

...