Android Dagger AppComponent在应用程序被杀死后仍然可用吗
我刚开始使用匕首库。我已经创建了一个AppComponent,其中包含我房间数据库的一个单实例。我有一个前台服务,当它的通知按钮被点击时,它需要向房间数据库写入一些东西。正如您所知,即使用户关闭应用程序,前台服务通知对用户始终可见。我认为,如果我的应用程序被终止,应用程序组件将不再可用。但现在我可以访问它,并在单击服务通知按钮时获取数据库实例,即使我的应用已从最近的应用中清除。这是我的密码: Dagger应用程序模块:Android Dagger AppComponent在应用程序被杀死后仍然可用吗,android,android-service,android-room,dagger-2,dagger,Android,Android Service,Android Room,Dagger 2,Dagger,我刚开始使用匕首库。我已经创建了一个AppComponent,其中包含我房间数据库的一个单实例。我有一个前台服务,当它的通知按钮被点击时,它需要向房间数据库写入一些东西。正如您所知,即使用户关闭应用程序,前台服务通知对用户始终可见。我认为,如果我的应用程序被终止,应用程序组件将不再可用。但现在我可以访问它,并在单击服务通知按钮时获取数据库实例,即使我的应用已从最近的应用中清除。这是我的密码: Dagger应用程序模块: @Module class AppModule { @Provid
@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()
广播接收机:
class MyBroadcastReceiver : BroadcastReceiver() {
@Inject
lateinit var database: MyDatabase
override fun onReceive(context: Context?, intent: Intent?) {
database = App.appComponent.getDatabase()
//Write something to database
}
}
即使应用程序完全死机,以前的代码也能正常工作。我现在只想知道,在应用程序被杀死后,我怎么可能访问appComponent?我使用的是标准溶液吗?我的代码有什么问题吗?有更好的方法吗 正如EpicPandaForce在评论中提到的,最近将应用程序刷走只会杀死任务,而不会杀死应用程序进程。无论任务是否已销毁,都可以终止应用程序进程。此外,如果你有一个前台服务在运行,你知道应用程序还没有被销毁 这不是您可以访问房间数据库的唯一原因 如果您的广播接收器正在运行,则您的应用程序已创建 假设您只有一个没有前台服务的通知。您的应用程序可能会在后台被删除,并且通知仍然存在。如果现在单击通知上的按钮,会发生什么情况 如以下文件所述: 在应用程序启动时,在创建任何活动、服务或接收器对象(不包括内容提供商)之前调用 实现应该尽可能快(例如使用延迟状态初始化),因为在该函数中花费的时间直接影响启动流程中第一个活动、服务或接收器的性能
当Android实例化你的
BroadcastReceiver
时,新创建的应用程序进程已经调用了App.onCreate()
,因此你可以通过AppComponent
应用程序的新实例访问房间数据库。onCreate()在你的应用程序启动时运行。清除最近的应用程序会清除任务,但不会立即终止进程。@EpicPandaForce您能解释更多吗?你的意思是appComponent
变量在应用程序被终止后仍保留在内存中吗?如果用户在关闭应用程序后长时间单击通知按钮会怎么样?当应用程序被关闭时,内存中不会有任何内容。我是说“从最近的刷卡”实际上并不会杀死这个应用程序。然而,@EpicPandaForce,如果应用程序被终止,前台服务通知是否可见?如果是的话,点击它的按钮会使我的应用程序崩溃吗?当应用程序真的死机时,甚至前台服务也会死机。