0

Android 应用程序由可视部分(活动)和绑定服务组成。可视化部分用于配置服务。配置存储在 Jetpack DataStore 中。服务读取每个客户端连接上的配置(在 onBind 中)。当从 Activity 保存新配置时,Service 继续接收旧值。服务仅在重新启动后才能获取新值。这不是我期望看到的。我希望我可以从任何应用程序位置(包括服务)获取实际的数据存储区值。顺便说一句,如果我从应用程序的视觉部分读取,我得到了实际值。

这就是我创建数据存储的方式:

// On top of the file
val Context.dataStoreTest: DataStore<Preferences> by preferencesDataStore(name = "test_data_store")
val TEST_STRING = stringPreferencesKey("test_string")

这就是我将值保存到数据存储区的方式:

class MyActivity : AppCompatActivity() {
    
    private lateinit var inputUserId: EditText
    
    override fun onCreate(savedInstanceState: Bundle?) {
       super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_settings)

        inputUserId = findViewById(R.id.settingsInputUserId)
        val buttonApply: Button = findViewById(R.id.settingsButtonApply)
        buttonApply.setOnClickListener {
            lifecycleScope.launch {
                applicationContext.dataStoreTest.edit {
                    it[TEST_STRING] = inputUserId.text.toString()
                }
            }
        }
    }
}

这就是我从服务中读取数据的方式:

class MyService : Service() {

    override fun onBind(intent: Intent): IBinder {

        GlobalScope.launch {
            val property = applicationContext.dataStoreTest.data
                .map { preferences ->
                    preferences[TEST_STRING] ?: ""
                }
                .first()
            Log.d(TAG,"property: $property")
        }
    }
}

我在 gradle 中导入的库:

implementation "androidx.datastore:datastore-preferences:1.0.0"

如果重要的话,当我从 Activity 和 Service 打印 Context.dataStoreTest 时,我会得到不同的结果:androidx.datastore.preferences.core.PreferenceDataStore@ca5d400androidx.datastore.preferences.core.PreferenceDataStore@dd8964b

编辑:

可能还不支持多进程访问:https ://issuetracker.google.com/issues/167700860

4

0 回答 0