You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 22:11:27