Я только начал использовать библиотеку Dagger. Я создал AppComponent, в котором храню одноэлементный экземпляр базы данных моей комнаты. У меня есть служба переднего плана, которой нужно что-то записать в базу данных комнаты при нажатии кнопки уведомления. Как вы знаете, уведомление службы переднего плана всегда видно пользователю, даже если пользователь закрывает приложение, и я подумал, что если мое приложение будет убито, AppComponent больше не будет использоваться. Но теперь я могу получить к нему доступ и получить экземпляр базы данных при нажатии кнопки уведомления службы, даже если мое приложение было удалено из последних приложений. Вот мой код:
Модуль приложения Dagger:
@Module
class AppModule {
@Provides
@Singleton
fun database(context: Context) = Room
.databaseBuilder(context, MyDatabase::class.java, "my_db.db").build()
}
Компонент приложения Dagger:
@Singleton
@Component(modules = [AppModule::class])
interface AppComponent {
@Component.Factory
interface Factory {
fun create(@BindsInstance context: Context): AppComponent
}
fun getDatabase(): MyDatabase
}
Класс приложения:
class App : Application() {
override fun onCreate() {
super.onCreate()
appComponent = DaggerAppComponent.factory().create(applicationContext)
}
companion object {
lateinit var appComponent: AppComponent
}
}
Передний план служебное уведомление:
val intent = Intent(applicationContext, MyBroadcastReceiver::class.java)
val pendingIntent = PendingIntent.getBroadcast(
applicationContext,
0,
stopIntent,
PendingIntent.FLAG_UPDATE_CURRENT
)
val notification = NotificationCompat
.Builder(applicationContext, "channel_id")
......
.addAction(0, "button text", pendingIntent)
......
.build()
BroadcastReceiver:
class MyBroadcastReceiver : BroadcastReceiver() {
@Inject
lateinit var database: MyDatabase
override fun onReceive(context: Context?, intent: Intent?) {
database = App.appComponent.getDatabase()
//Write something to database
}
}
Предыдущий код работает отлично, даже если приложение полностью убито. Я просто хочу теперь узнать, как я могу получить доступ к appComponent после того, как приложение было убито? Я использую стандартное решение? Что-то не так с моим кодом? Есть лучший способ сделать это?