Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android Dagger AppComponent在应用程序被杀死后仍然可用吗_Android_Android Service_Android Room_Dagger 2_Dagger - Fatal编程技术网

Android Dagger AppComponent在应用程序被杀死后仍然可用吗

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

我刚开始使用匕首库。我已经创建了一个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()
广播接收机:

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,如果应用程序被终止,前台服务通知是否可见?如果是的话,点击它的按钮会使我的应用程序崩溃吗?当应用程序真的死机时,甚至前台服务也会死机。