WorkManagerを「2.2.0」から「2.3.0-rc01」にアップグレードすると、次の新しいエラーが発生します
APKをエクスポートするとエラーが発生します。
_C:\app: Error: Remove androidx.work.impl.WorkManagerInitializer from your AndroidManifest.xml when using on-demand initialization. [RemoveWorkManagerInitializer]
Explanation for issues of type "RemoveWorkManagerInitializer":
If an Android.app.Application implements
androidx.work.Configuration.Provider,
the default androidx.work.impl.WorkManagerInitializer needs to be removed
from the
AndroidManifest.xml file.
_
2.2.0で「オンデマンド初期化」が導入されたため、2.2.0でこのようなエラーが発生しなかった理由がわかりません。
_AndroidManifest.xml
_に以下を含めるのが正しいことかどうか、私にはよくわかりません。
_<provider
Android:name="androidx.work.impl.WorkManagerInitializer"
Android:authorities="${applicationId}.workmanager-init"
tools:node="remove" />
_
現在、以下は私のApplication
クラスです。
_public class MyApplication extends MultiDexApplication implements Configuration.Provider {
private static MyApplication me;
@Override
public void onCreate() {
super.onCreate();
me = this;
}
public static MyApplication instance() {
return me;
}
@NonNull
@Override
public Configuration getWorkManagerConfiguration() {
return new Configuration.Builder()
.build();
}
}
_
_public static WorkManager getWorkManager() {
MyApplication myApplication = MyApplication.instance();
if (myApplication == null) {
// Very rare Edge case. Not sure how it happens. But, it happens :)
return WorkManager.getInstance();
} else {
return WorkManager.getInstance(myApplication);
}
}
_
Application
クラスがnullの場合、「デフォルトの初期化」(WorkManager.getInstance()
)も実行されている可能性はほとんどありません。
次のprovider
を含めることで、APKエクスポート中のエラーを簡単に排除できます。しかし、そうすることは正しいことでしょうか?
_<provider
Android:name="androidx.work.impl.WorkManagerInitializer"
Android:authorities="${applicationId}.workmanager-init"
tools:node="remove" />
_
このlintルールはWorkManager 2.3.0-*
で導入されました。このLintルールで対処しようとしている問題は、WorkManagerInitializer
ContentProvider
とApplication
サブタイプの両方がConfiguration.Provider
(オンデマンド初期化用)を実装している場合、ContentProvider
はalways取るということです。優先。
これは、特にConfiguration
alwaysがデフォルトの構成を使用するためにされないが有効になる追加のContentProvider
がある場合、特に予期しない可能性があります。
本当に必要なのは、デフォルトのプロバイダーを削除することだけです。そうすれば、初期化は熱心ではなくなり、オンデマンドになります。
WorkManagerInitializer
は、WorkManager
にコンテキストを提供するために使用されます。これは、コンテンツプロバイダーがApplication
の前に初期化されるために発生します( この質問 を参照)。これが、カスタム初期化を行う場合にコンテキストを自分で提供する必要がある理由です。したがって、カスタム初期化を使用する場合、それは必要ありません。
コンテンツプロバイダー からgetWorkManager
メソッドを呼び出す場合、アプリケーションインスタンスはnull
になります。この問題を解決するには、コンテンツプロバイダー内でgetContext
を呼び出して、コンテキストをパラメーターとしてメソッドに渡します。
public static WorkManager getWorkManager(Context context) {
return WorkManager.getInstance(context);
}
public class MyContentProvider extends ContentProvider {
@Override
public boolean onCreate() {
WorkManager workManager = getWorkManager(getContext());
...
}
...
}