Невозможно запустить WorkManager из отдельного процесса

Я использую библиотеку WorkManager (версия 1.0.0-alpha12). В своем приложении я создаю новый процесс, используя следующую строку xml в AndroidManifest.

android:process=":myprocess"

Вот как я использую WorkManager:

 public static void startCheckStatusWorker() {
    WorkManager manager = WorkManager.getInstance();
    String uniqueName = "check_status_worker";
    PeriodicWorkRequest.Builder builder = new PeriodicWorkRequest.Builder(CheckStatusWorker.class, 1, TimeUnit.DAYS);
    builder.setConstraints(new Constraints.Builder().setRequiredNetworkType(NetworkType.CONNECTED).build());
    PeriodicWorkRequest request = builder.build();
    manager.enqueueUniquePeriodicWork(uniqueName, ExistingPeriodicWorkPolicy.KEEP, request);
 }

Но когда я вызываю этот метод из нового процесса, приложение вылетает. Это выброшенное исключение,

java.lang.IllegalStateException: WorkManager is not initialized properly.  The most likely cause is that you disabled WorkManagerInitializer in your manifest but forgot to call WorkManager#initialize in your Application#onCreate or a ContentProvider.
at androidx.work.WorkManager.getInstance(WorkManager.java:139)

Если я вызываю тот же метод, из обычного процесса приложения он работает хорошо, и я не отключаю WorkManagerInitializer в своем манифесте приложения, как он предлагает.

Есть ли способ получить экземпляр WorkManager из нового процесса?

Любое предложение будет оценено. Спасибо.


person chathura    schedule 12.12.2018    source источник
comment
См. Мое сообщение здесь: stackoverflow.com/questions/51845895/   -  person Scott Driggers    schedule 25.12.2020


Ответы (1)


Если вам ДЕЙСТВИТЕЛЬНО нужно, чтобы служба находилась в отдельном процессе, вы можете отключить WorkManagerInitializer в AndroidManifest. Идет примерно так:

    <provider
        android:name="androidx.work.impl.WorkManagerInitializer"
        android:authorities="${applicationId}.workmanager-init"
        tools:node="remove"
        android:exported="false" />

(Официальную документацию см. На странице https://developer.android.com/topic/libraries/architecture/workmanager/advanced/custom-configuration#java).

После его отключения в вашем классе Application (если у вас его нет, вы должны создать свой собственный и расширить класс Android Application) и вызвать WorkManager.initialize ().

Это исправило это для меня.

Но обратите внимание: согласно некоторым ответам на форумах по проблемам Google (https://issuetracker.google.com/issues/79993883), workmanager по-прежнему будет использовать основной процесс для выполнения работы (даже если он вызывается из второго процесса).

Что рекомендую? Если нет серьезных преимуществ от наличия службы в неосновном процессе, вы должны просто сделать службу в основном процессе, так как ее будет сложнее поддерживать (например, статические глобальные переменные будут иметь два экземпляра, по одному для каждого процесс)

person edy    schedule 19.12.2018
comment
Есть ли способ заставить workmanager работать в библиотеке отдельно от приложения, которое использует эту библиотеку? - person ddog; 09.01.2019
comment
я не уверен, но я думаю, что ты можешь. В проекте android ›your-lib› build.gradle объявлен workmanager. app-module ›build.gradle будет иметь workmanager из вашей библиотеки - person edy; 10.01.2019