1.問題描述:
主app進入後台,此時切換系統菜單暗黑模式按鈕,卡片如何監聽系統colorMode ,此時卡片如何做暗黑模式切換?
解決方案:
適配方案依靠資源目錄,當系統對應的設置項發生變化後(如系統語言、深淺色模式等),應用會自動加載對應資源目錄下的資源文件。系統為深色模式預留了dark目錄,該目錄在應用創建時默認不存在,在進行深色模式適配時,需要開發者在src/main/resources中手動創建出dark目錄,將深色模式所需的資源放置到該目錄下。對於淺色模式所需的資源,可以放入默認存在的src/main/resources/base目錄下。具體步驟為:
-
在src/main/resources/base/element/color.json文件中定義頁面元素在淺色模式下的顏色值。
{ "color": [ { "name": "text_color", "value": "#000000" } ] } -
在src/main/resources/dark/element/color.json文件中定義頁面元素在淺色模式下的顏色值。
{ "color": [ { "name": "text_color", "value": "#FFFFFF" } ] } -
在代碼中引用自定義的顏色資源值,使用$r加載自定義顏色資源,系統將自動在應用深淺色變化時,加載對應限定詞目錄下的資源文件,從而改變頁面元素的顏色完成深淺色適配。
@Entry @Component struct Card { build() { Row() { Text('hello') .fontColor($r('app.color.text_color')) } .width('100%') .height('100%') } }
2.問題描述:
FormExtensionAbility生命週期中提供了onConfigurationUpdate生命週期回調,該生命週期回調在系統深淺色模式發生變化時是否會觸發?
解決方案:
因系統規格設計,當系統配置項變更時,僅系統應用拉活應用服務卡片對應的EntryFormAbility並觸發相應的onConfigurationUpdate回調函數。
三方應用僅當FormExtensionAbility存活時才會觸發onConfigurationUpdate回調。
3.問題描述:
通過mediaquery.matchMediaSync接口可以設置媒體查詢的查詢條件,是否可以通過mediaquery.matchMediaSync('(dark-mode: true)')直接在卡片頁面註冊系統深淺色監聽回調?
解決方案:
由於卡片規格限制,雖然該接口支持在ArkTS卡片頁面中使用,但是無法監聽獲取查詢結果。
4.問題描述:
是否可以使用PersistentStorage和AppStorage在應用和卡片之間進行狀態數據共享?
解決方案:
卡片和應用的主進程不是一個進程,而AppStorage是和進程綁定的,僅支持應用的主線程內多個UIAbility實例間的UI狀態數據共享,所以卡片和應用主進程之間無法使用PersistentStorage和AppStorage進行狀態數據共享。
5.問題描述:
跨進程經常需要數據共享如服務卡片和其主應用,但在主應用更新首選項數據後,在服務卡片中用取到的值錯誤的場景。
解決方案:
不同進程的內存不共享,同一進程中getPreferences只有首次會從持久化中取,所以要跨進程讀取最新的持久化數據時,需先通過preferences.removePreferencesFromCache接口將Preferences實例移出緩存中的實例之後,再次getPreferences將會重新讀取持久化文件,生成新的Preferences實例。
以主應用中更新首選項中的data,在服務卡片中通過首選項取data為例。
在主應用中更新data,並通知服務卡片更新。
preferences.getPreferences(this.context, 'myPreference', (err: BusinessError, pf: preferences.Preferences) => {
if (err) {
console.error("Failed to get preferences. code =" + err.code + ", message =" + err.message);
return;
}
pf.put("formData", data);
pf.flush();
formProvider.updateForm(curFormId, formMsg);
console.info("Succeeded in getting preferences.");
})
卡片中收到更新事件如onFormEvent方法回調時,需要先通過removePreferencesFromCache清緩存的Preferences實例再重新取Preferences實例。
async function getCache() {
await preferences.removePreferencesFromCache(context, 'myPreference');
const pf = await preferences.getPreferences(context, 'myPreference');
const data = await pf.get('formData', 'fault');
console.info("cache data: " + data);
}