在Android 中的计划作业服务中注入依赖项的最佳方法是什么? 我的JobService计划在夜间运行以做一些事情。
在 JobService 构造函数中,我正在尝试在我的应用程序类上注入我的依赖项。
MyApp.component().inject(this);
但有时MyApp
此时未初始化,因此注入失败。
也许我以错误的方式使用dagger?还是必须为作业服务创建自己的组件?
这是我的应用程序类
public class MyApp extends Application {
private static AppComponent appComponent;
@Override
public void onCreate() {
super.onCreate();
buildAppComponent();
}
public static AppComponent component(){
return appComponent;
}
private void buildAppComponent(){
if(appComponent == null){
appComponent = DaggerAppComponent.builder()
.appModule(new AppModule(this))
.build();
}
}
}
您应该使用 AndroidInjector 注入 android 类,例如 Activities/Fragments/Services/BroadcastReceivers/ContentProviders。
首先确保你从你的build.gradle
中添加了dagger-安卓依赖项
implementation 'com.google.dagger:dagger:2.16'
implementation 'com.google.dagger:dagger-android:2.16'
implementation 'com.google.dagger:dagger-android-support:2.16'
annotationProcessor 'com.google.dagger:dagger-compiler:2.16'
annotationProcessor 'com.google.dagger:dagger-android-processor:2.16'
然后确保应用组件继承自AndroidInjector
@Singleton
@Component(modules = {AndroidSupportInjectionModule.class,
ApplicationModule.class,
ActivityBuilderModule::class,
ServiceBuilderModule::class})
public interface ApplicationComponent extends AndroidInjector<MyApp> {
@Component.Builder
interface Builder {
@BindsInstance
Builder application(MyApp application);
ApplicationComponent build();
}
}
ActivityBuilderModule
和ServiceBuilderModule
使用方便的注释ContributesAndroidInjector
引用所有活动和服务子组件,该注释将自动生成子组件
@Module
abstract class ActivityBuilderModule {
@ContributesAndroidInjector(modules = {MainActivityModule.class})
@ActivityScope
abstract MainActivity contributeMainActivity();
@ContributesAndroidInjector(modules = {DummyModule.class})
@ActivityScope
abstract DummyActivity contributeDummyActivity();
//...
}
服务也一样
@Module
abstract class ServiceBuilderModule {
@ContributesAndroidInjector
abstract MyService contributeAuthenticatorService();
//...
}
最后在这里你的MyApp
应该是什么样
public class MyApp extends DaggerApplication() {
private ApplicationComponent appComponent;
@Override
public void onCreate() {
super.onCreate();
appComponent = DaggerApplicationComponent.builder()
.application(this)
.build();
}
AndroidInjector<? extends DaggerApplication> applicationInjector(){
return appComponent;
}
}
您的服务现在应该是可注入的,为了完成此操作,您当然还需要注入片段,例如,对于MainActivity
片段,您将从MainActivityModule
进行FragmentBuilderModule
@Module(includes = {FragmentBuilderModule.class})
abstract class MainActivityModule {
@Binds
@ActivityScope
abstract AppCompatActivity bindActivity(MainActivity activity);
//...
}
在这里FragmentBuilderModule
类
@Module
abstract class FragmentBuilderModule {
@ContributesAndroidInjector(modules = {HomeFragmentModule.class})
@FragmentScope
abstract HomeFragment contributeHomeFragment();
@ContributesAndroidInjector(modules = DummyFragmentModule.class})
@FragmentScope
abstract DummyFragment contributeDummyFragment() ;
//...
}
你可以从我的项目模板中看到更多 这里 虽然它是 kotlin。