gpt4 book ai didi

java - 将依赖项注入(inject) Dagger2 中的后台服务

转载 作者:太空宇宙 更新时间:2023-11-03 12:04:07 24 4
gpt4 key购买 nike

我有 Shared Preferences 作为 Dagger 单例组件。我需要将它注入(inject)后台服务,例如 FirebaseInstanceService。这是我的尝试:

public class InstanceIDListenerService extends FirebaseInstanceIdService {
@Inject
Preferences preferences;

@Override
public void onTokenRefresh() {
((MyApp) getApplication()).getSingletonComponent().inject(this);
String refreshedToken = FirebaseInstanceId.getInstance().getToken();
preferences.setFcmToken(refreshedToken);

}
}

它的用法是这样的:

   <service android:name="com.fcm.InstanceIDListenerService">
<intent-filter>
<action android:name="com.google.firebase.INSTANCE_ID_EVENT" />
</intent-filter>
</service>

我应该在 onTokenRefresh 监听器中使用 ((MyApp) getApplication()).getSingletonComponent().inject(this); 吗?这是注入(inject)依赖项的正确监听器吗?

最佳答案

我知道这个问题很老,但在过去的几个小时里我一直在思考这个问题,并找到了解决方案。

使用新的 Dagger2 版本,您现在可以让您的应用程序实现 HasServiceInjector 接口(interface),该接口(interface)允许您将内容注入(inject)服务。

一个简单的例子:

1) 创建您的服务模块:

@Module
abstract class ServicesModule {

@ContributesAndroidInjector
abstract SomeService ProvideSomeService();
}

2) 将其添加到您的 App 组件中:

@Component(modules = {
AndroidSupportInjectionModule.class,
AppModule.class,
ActivitiesModule.class,
ServicesModule.class
})
public interface AppComponent {

@Component.Builder
interface Builder {
@BindsInstance
Builder application(App application);

AppComponent build();
}

void inject(App app);
}

3) 让您的应用程序实现上述接口(interface):

public class App extends Application implements HasActivityInjector, HasServiceInjector {

@Inject
DispatchingAndroidInjector<Activity> activityInjector;
@Inject
DispatchingAndroidInjector<Service> serviceInjector;

@Override
public void onCreate() {
super.onCreate();
AppInjector.init(this);
}

@Override
public AndroidInjector<Activity> activityInjector() {
return activityInjector;
}

@Override
public AndroidInjector<Service> serviceInjector() {
return serviceInjector;
}
}

4) 最后,注入(inject)你的服务:

public class SomeService extends Service {

@Inject
SomeDependency dependency;

@Override
public void onCreate() {
AndroidInjection.inject(this);
super.onCreate();
}

// Do things with your dependencies

}

我在示例中使用的是服务,但我的实际用例也是使用 FirebaseInstanceIdService。这奏效了。

关于java - 将依赖项注入(inject) Dagger2 中的后台服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40585099/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com