android - 如何使用 Dagger 2 向 MyFirebaseMessagingService 提供数据库,以便我可以在 android 本地存储 fcm 消息
问题描述
我怎样才能将数据库实例传递给MyFirebaseMessagingService
扩展的类,FirebaseMessagingService
以便我可以data
在本地保存有效负载?
注意:我已经在我的应用程序中设置了 dagger 2,它运行良好。
下面是MyFirebaseMessagingService
类:
class MyFirebaseMessagingService @Inject constructor(exampleOneDao: ExampleOneDao?) : FirebaseMessagingService() {
override fun onMessageReceived(remoteMessage: RemoteMessage?) {
//need db instance to store data payload locally (Room)
}
}
下面是AppModule
Dagger 2 的类
@Module(includes = arrayOf(ViewModelModule::class))
class AppModule() {
// --- DATABASE INJECTION ---
@Provides
@Singleton
internal fun provideDatabase(application: Application): MyDatabase {
return Room.databaseBuilder(application,
MyDatabase::class.java, "MyDatabase.db")
.build()
}
@Provides
@Singleton
internal fun provideExampleOneDao(database: MyDatabase): ExampleOneDao {
return database.exampleOneDao()
}
@Provides
@Singleton
internal fun provideMyFirebaseMessagingService(exampleOneDao:
ExampleOneDao): MyFirebaseMessagingService {
return MyFirebaseMessagingService(exampleOneDao)
}
}
是否可以为MyFirebaseMessagingService
课堂提供数据库和 dao?
我尝试了上述方法来提供exampleOneDao
给MyFirebaseMessagingService
班级,但它抛出了以下内容Exception
MyFirebaseMessagingService: java.lang.InstantiationException: java.lang.Class<com.example.user.app.firebase.messaging.MyFirebaseMessagingService> has no zero argument constructor
谢谢你。
解决方案
终于从这个链接得到了解决方案:https ://github.com/googlesamples/android-architecture-components/issues/253
作为MyFirebaseMessagingService
一个Service
类,对于类中的注入Service
,Dagger 提供了一种方法,通过它我们可以将依赖项注入到 Service 类中。以下是在服务类中启用注入的步骤:
1) 使 Application 实现 HasServiceInjector 并为服务注入 DispatchingAndroidInjector。
public class App extends Application implements HasActivityInjector, HasServiceInjector {
@Inject
DispatchingAndroidInjector<Activity> dispatchingActivityInjector;
// Add this line
@Inject
DispatchingAndroidInjector<Service> dispatchingServiceInjector;
@Override
public void onCreate() {
super.onCreate();
AppInjector.init(this);
}
@Override
public AndroidInjector<Activity> activityInjector() {
return dispatchingActivityInjector;
}
// override this method after implementing HasServiceInjector
@Override
public AndroidInjector<Service> serviceInjector() {
return dispatchingServiceInjector;
}
}
2)创建一个新模块来对您的服务执行注入。
@Module
abstract class ServiceBuilderModule {
// for my case, the service class which needs injection is MyFirebaseMessagingService
@ContributesAndroidInjector
abstract MyFirebaseMessagingService contributeMyFirebaseMessagingService();
}
3) 在您的应用程序组件中注册您的新模块。
@Component(modules = {
AndroidSupportInjectionModule.class,
AppModule.class,
ActivityBuilderModule.class,
// Need to define previously created module class here
ServiceBuilderModule.class
})
@Singleton
public interface AppComponent {
@Component.Builder
interface Builder {
@BindsInstance
Builder application(App application);
AppComponent build();
}
void inject(App app);
}
4) 最后,覆盖添加 AndroidInjection.inject(this) 的服务的 onCreate 方法。
public class MyFirebaseMessagingService extends FirebaseMessagingService {
//So now we are able to inject here same as we do in Activity. No need for constructor injection
@Inject ExampleOneDao exampleOneDao
// Override this method first
@Override
public void onCreate() {
AndroidInjection.inject(this);
super.onCreate();
}
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
// use your dao here to store remoteMessage data payload into your database, e.g exampleOneDao.save(somethingHere)
}
}
推荐阅读
- php - 在 mysql 和 PHP 中增加一个像 = +1 这样的值
- oracle - 一种在 Oracle 中呈现数据的方法
- ios - 有没有办法只为 Appstore 审阅者打开 url?
- sql - 使用 unpivot 将未知数量的列转换为行的动态 SQL 查询
- php - 优化 SQL 查询
- python - Selenium python:无法向下滚动覆盖窗口
- javascript - Fetch Api 在某些情况下不起作用
- ios - 如何通过 UBER 深层链接向我的客户/用户获得奖励?
- c# - PropertyChangedCallback 不更新 GUI
- ruby-on-rails - Rails gem 来源什么也没显示