Wear OS complication无法实时更新SharedPreferences存储的最新值
解决Complication无法立即更新的问题
问题核心在于Complication不会自动监听SharedPreferences的变化,默认仅会按配置的UPDATE_PERIOD_SECONDS或系统触发时机更新。要实现存入新值后立即刷新,需手动触发Complication的更新请求,具体步骤如下:
步骤1:在保存数据后添加更新触发逻辑
在你写入SharedPreferences的代码后,添加代码直接请求Complication Provider更新:
Java代码(对应Activity中的保存逻辑)
// 保存数据到SharedPreferences SharedPreferences.Editor editor = getSharedPreferences("MY_PREFS_NAME", MODE_PRIVATE).edit(); editor.putString("temp", wristSkinTempC); editor.putString("tempF", wristSkinTempF); editor.apply(); // 触发Complication更新 ComponentName complicationProvider = new ComponentName(this, CustomComplicationC.class); ComplicationDataSourceUpdateRequester requester = ComplicationDataSourceUpdateRequester.create( this, complicationProvider ); requester.requestUpdateAll();
依赖配置
确保build.gradle中包含Wear相关依赖:
implementation "androidx.wear:wear-complications-data:1.0.1" implementation "androidx.wear:wear-complications-provider:1.0.1"
步骤2:确保Complication Provider正确处理更新
你的CustomComplicationC需继承ComplicationProviderService,并重写onComplicationUpdate方法,在该方法中调用生成Complication数据的逻辑:
class CustomComplicationC : ComplicationProviderService() { override fun onComplicationUpdate( complicationId: Int, type: ComplicationType, listener: ComplicationUpdateListener ) { // 重新读取最新SharedPreferences值并生成Complication数据 val complicationData = createAppShortcutComplication() listener.onComplicationUpdate(complicationId, complicationData) } private fun createAppShortcutComplication(): ComplicationData { val prefs = getSharedPreferences("MY_PREFS_NAME", MODE_PRIVATE) val tempC = prefs.getString("temp", "") ?: "" val intent = Intent(this, MainActivity::class.java).apply { component = ComponentName(this@CustomComplicationC, MainActivity::class.java) } val pendingIntent = PendingIntent.getActivity( this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE ) return ShortTextComplicationData.Builder( text = PlainComplicationText.Builder(text = tempC).build(), contentDescription = PlainComplicationText.Builder(text = "当前体温").build() ).setMonochromaticImage( MonochromaticImage.Builder( image = Icon.createWithResource(this, R.drawable.iconforbody), ).build() ).setTapAction(pendingIntent) .build() } }
步骤3:修正Manifest配置
确保Complication Provider Service注册时添加更新请求的Intent Filter:
<service android:name=".CustomComplicationC" android:exported="true"> <intent-filter> <action android:name="android.support.wearable.complications.action.COMPLICATION_UPDATE_REQUEST" /> </intent-filter> <meta-data android:name="android.support.wearable.complications.SUPPORTED_TYPES" android:value="SHORT_TEXT" /> <meta-data android:name="android.support.wearable.complications.UPDATE_PERIOD_SECONDS" android:value="30" /> </service>
关键说明
ComplicationDataSourceUpdateRequester会直接触发Provider的onComplicationUpdate方法,此时Provider会重新读取SharedPreferences的最新值,生成并返回新的ComplicationData,实现即时更新。- 必须添加
COMPLICATION_UPDATE_REQUEST的Intent Filter,否则Provider无法接收更新请求。 - 若需更新单个绑定的Complication,可使用
requestUpdate(complicationId)替代requestUpdateAll()。
内容的提问来源于stack exchange,提问作者SP Apps
相关产品推荐
相关产品推荐

