Проект HarmonyOS: приложение для напоминаний о событиях в виде карточек-напоминаний
Проект представляет собой простое приложение, которое позволяет создавать карточки-напоминания о событиях текущего дня и размещать их на рабочем столе для наглядного просмотра предстоящих дел.
Цель проекта — помочь разработчикам быстро освоить следующие технические аспекты:
В этом руководстве мы рассмотрим только основной код. Вы можете скачать полный код в разделе «Ссылки».
Структура кода проекта:
Инициализация данных для отображения на карточке происходит в методе bindFormData класса WidgetImpl.java.
public ProviderFormInfo bindFormData() {
ZSONObject zsonObject = new ZSONObject();
ProviderFormInfo providerFormInfo = new ProviderFormInfo();
String scheduleData = StorageUtil.initPreferences(context).getSchedule();
if(!"".equals(scheduleData)) {
ZSONArray array = ZSONArray.stringToZSONArray(scheduleData);
if(array.size()>0) {
ZSONArray result = StorageUtil.getSwiperCardSchedule(array);
CardConstant.SWIPER_CARD_LENGTH = result.size();
zsonObject.put("schedule", result);
zsonObject.put("count", array.size());
}
}
zsonObject.put("index", 0);
providerFormInfo.setJsBindingData(new FormBindingData(zsonObject));
return providerFormInfo;
}
private class PreferencesChangeCounter implements Preferences.PreferencesObserver {
Context mContext;
public PreferencesChangeCounter(Context context){
this.mContext = context;
}
@Override
public void onChange(Preferences preferences, String key) {
Intent intent = new Intent();
Operation operation = new Intent.OperationBuilder()
.withDeviceId("")
.withBundleName("com.example.myohoscard")
.withAbilityName("com.example.myohoscard.CardServiceAbility")
.build();
``` **Карточки: обновление и ротация**
В этом тексте описывается процесс обновления и ротации карточек в приложении.
* **Обновление карточек:**
* В методе onCommand сервиса CardServiceAbility происходит обновление карточек.
* Метод swiperData принимает массив ZSONArray и обновляет данные карточек с помощью метода StorageUtil.getSwiperCardSchedule.
* Затем создаётся объект FormBindingData, который содержит обновлённые данные о карточках.
* После этого происходит обновление форм с помощью метода updateForm.
* **Ротация карточек:**
* Ротация карточек также осуществляется в методе onCommand сервиса CardServiceAbility.
* Создаётся новый поток, который периодически обновляет формы с данными о карточках через определённые интервалы времени.
* Если поток прерывается, то происходит обработка этого события.
* Обновляются данные о карточке, после чего происходит обновление формы.
**Недостатки:**
Если приложение закрывается, то сервис перестаёт работать, и ротация карточек прекращается. Вот перевод текста на русский язык:
#### 4. Обновление карточки
1. **Конфигурация периодического обновления в config.json**:
В файле config.json для конфигурации карточки jscard2x4 устанавливается «updateEnabled»: true и «updateDuration»: 1, где параметр updateDuration равен 30 минутам. Это означает, что карточка будет обновляться каждые 30 минут.
Для периодического обновления вызывается метод updateFormData в файле Jscard2x4Impl.java:
public void updateFormData(long formId, Object... vars) { HiLog.info(TAG, "update form data timing, default 30 minutes"); String scheduleData = StorageUtil.initPreferences(context).getSchedule(); if (!"".equals(scheduleData)) { ZSONArray array = ZSONArray.stringToZSONArray(scheduleData); if (array.size() > 0) { FormBindingData formBindingData = new FormBindingData(getObject(array, new ZSONObject())); // есть метод getObject() try { ((MainAbility) context).updateForm(formId, formBindingData); } catch (FormException e) { e.printStackTrace(); } } } }
2. **Обновление данных при изменении расписания**:
Если данные изменяются, запускается метод наблюдения за данными. В классе StorageUtil.java открывается сервис CardServiceAbility. В методе onCommand сервиса CardServiceAbility вызывается cardData для обновления карточки. Код обновления выглядит следующим образом:
FormBindingData formBindingData = new FormBindingData(Jscard2X4Impl.getObject(array,new ZSONObject()));//есть метод getObject() FormControllerManager formControllerManager = FormControllerManager.getInstance(this);
try { for (long id : formControllerManager.getAllFormIdFromSharePreference(CardConstant.JS_CARD_FORMS_NAME)) { updateForm(id, formBindingData); } } catch (FormException e) { e.printStackTrace(); }
#### 5. Обработка событий router и message
1. **События router**:
На странице перехода принимаются параметры и обрабатываются. Посмотрите на метод onStart в классе MainAbility.java:
String strParams = intent.getStringParam("params"); if (strParams != null) { ZSONObject data = ZSONObject.stringToZSON(strParams); String message = data.getString("message"); // Здесь можно определить, какая кнопка была нажата, и выполнить соответствующие действия new ToastDialog(this).setText(message) .setAlignment(LayoutAlignment.CENTER).show(); }
2. **События message**:
Обрабатываются в методе onTriggerFormEvent в файле Jscard2x4Impl.java:
public void onTriggerFormEvent(long formId, String message) { HiLog.info(TAG, "handle card click event."); ZSONObject data = ZSONObject.stringToZSON(message); String msg = data.getString("msg");
Intent intent = new Intent();
intent.setParam("params", "{\"message\":\"" + msg + "\"}");
Operation operation = new Intent.OperationBuilder()
.withDeviceId("")
.withBundleName("com.example.myohoscard")
.withAbilityName("com.example.myohoscard.MainAbility")
.build();
intent.setOperation(operation);
((MainAbility)context).startAbility(intent);
}
public ProviderFormInfo bindFormData() { HiLog.info(TAG, "bind form data when create form"); ProviderFormInfo providerFormInfo = new ProviderFormInfo(RESOURCE_ID_MAP.get(dimension), context); String scheduleData = StorageUtil.initPreferences(context).getSchedule(); if (!"".equals(scheduleData)) { ZSONArray array = ZSONArray.stringToZSONArray(scheduleData); if (array.size() > 0) { // ComponentProvider представляет Java-карточку ComponentProvider componentProvider = new ComponentProvider(); providerFormInfo.mergeActions(getFormDataCreate(array, context, dimension, componentProvider)); } }
return providerFormInfo;
}
В этом методе происходит создание объекта ProviderFormInfo, который содержит данные для отображения формы. Затем происходит получение данных из файла config.json и их обработка.
Также в этом файле есть метод getFormDataCreate(), который создаёт данные для формы:
public static ComponentProvider getFormDataCreate(ZSONArray array, Context context, int dimension, ComponentProvider componentProvider) { componentProvider.setVisibility(ResourceTable.Id_count, Text.VISIBLE); componentProvider.setText(ResourceTable.Id_count, array.size() + "");
ZSONArray result = StorageUtil.getCurrentCardSchedule(array);
ZSONObject schedule_current = ZSONObject.stringToZSON(ZSONObject.toZSONString(result.get(0)));
if (schedule_current != null) {
componentProvider.setText(ResourceTable.Id_time, schedule_current.getString("startCardShow") + "-" + schedule_current.getString("endCardShow"));
componentProvider.setText(ResourceTable.Id_schedule, schedule_current.getString("title"));
}
if (dimension == DEFAULT_DIMENSION_2X2) {
componentProvider.setIntentAgent(ResourceTable.Id_layout, getStartAbilityIntentAgent(context));
}
if (dimension == DIMENSION_2X4) {
componentProvider.setVisibility(ResourceTable.Id_noschedule, Text.HIDE);
ZSONObject schedule_1 = ZSONObject.stringToZSON(ZSONObject.toZSONString(result.get(1)));
if (schedule_1 != null) {
// componentProvider.setText(ResourceTable.Id_time1, schedule_1.getString("startCardShow")+"-"+schedule_1.getString("endCardShow")); componentProvider.setText(ResourceTable.Id_schedule1, schedule_1.getString("title")); }
ZSONObject schedule_2 = null;
if (result.get(2) != null) {
schedule_2 = ZSONObject.stringToZSON(ZSONObject.toZSONString(result.get(2)));
}
if (schedule_2 != null) {
componentProvider.setVisibility(ResourceTable.Id_line, Text.VISIBLE);
// componentProvider.setText(ResourceTable.Id_time2, schedule_2.getString("startCardShow")+"-"+schedule_2.getString("endCardShow")); componentProvider.setText(ResourceTable.Id_schedule2, schedule_2.getString("title")); } }
if (dimension == DIMENSION_2X4) {
componentProvider.setIntentAgent(ResourceTable.Id_more, getStartAbilityIntentAgent(context));
}
return componentProvider;
}
Этот метод создаёт данные для формы на основе полученных данных из файла config.json.
**Обновление карточки**
Для обновления карточки используется метод updateFormData():
public void updateFormData(long formId, Object... vars) { HiLog.info(TAG, "update form data timing, default 30 minutes");
String scheduleData = StorageUtil.initPreferences(context).getSchedule();
if ("".equals(scheduleData)) {
ZSONArray array = ZSONArray.stringToZSONArray(scheduleData);
if (array.size() > 0) {
ComponentProvider componentProvider =
new ComponentProvider(RESOURCE_ID_MAP.get(dimension), context);
try {
((MainAbility) context).updateForm(formId, getFormDataUpdate(array, context, dimension, componentProvider));
} catch (FormException e) {
HiLog.error(TAG, e.toString());
}
}
}
}
Этот метод обновляет данные на карточке на основе данных из файла config.json. **Перевод текста на русский язык:**
getFormDataUpdate(ZSONArray array, Context context, int dimension, ComponentProvider componentProvider) { componentProvider.setVisibility(ResourceTable.Id_count, Text.VISIBLE); componentProvider.setText(ResourceTable.Id_count, array.size() + "");
ZSONArray result = StorageUtil.getCurrentCardSchedule(array);
ZSONObject schedule_current = ZSONObject.stringToZSON(ZSONObject.toZSONString(result.get(0)));
if (schedule_current != null) {
componentProvider.setText(ResourceTable.Id_time, schedule_current.getString("startCardShow") + "-" + schedule_current.getString("endCardShow"));
componentProvider.setText(ResourceTable.Id_schedule, schedule_current.getString("title"));
}
if (dimension == DIMENSION_2X4) {
componentProvider.setVisibility(ResourceTable.Id_noschedule, Text.HIDE);
ZSONObject schedule_1 = ZSONObject.stringToZSON(ZSONObject.toZSONString(result.get(1)));
if (schedule_1 != null) {
// componentProvider.setText(ResourceTable.Id_time1, schedule_1.getString("startCardShow")+"-"+schedule_1.getString("endCardShow"));
componentProvider.setText(ResourceTable.Id_schedule1, schedule_1.getString("title"));
}
ZSONObject schedule_2 = null;
if (result.get(2) != null) {
schedule_2 = ZSONObject.stringToZSON(ZSONObject.toZSONString(result.get(2)));
}
if (schedule_2 != null) {
componentProvider.setVisibility(ResourceTable.Id_line, Text.VISIBLE);
// componentProvider.setText(ResourceTable.Id_time2, schedule_2.getString("startCardShow")+"-"+schedule_2.getString("endCardShow"));
componentProvider.setText(ResourceTable.Id_schedule2, schedule_2.getString("title"));
}
}
return componentProvider;
}
**2)Добавление данных о расписании на текущий день и обновление расписания**
При изменении данных запускается метод для отслеживания изменений данных, код которого находится в инструменте StorageUtil.java. Здесь активируется сервис CardServiceAbility. В методе onCommand сервиса CardServiceAbility вызывается метод cardData для обновления карточки. Код обновления следующий:
```try {
for (long id:formControllerManager.getAllFormIdFromSharePreference(CardConstant.JAVA_CARD_FORMS_NAME)) {
int dimension = formControllerManager.getDimension(id+"");
ComponentProvider componentProvider =
new ComponentProvider(Javacard2x4Impl.RESOURCE_ID_MAP.get(dimension), this);
updateForm(id, Javacard2x4Impl.getFormDataUpdate(array,this,dimension,componentProvider));//上一步中有此方法代码
}
} catch (FormException e) {
e.printStackTrace();
}```
5. **Добавление события клика на карточку**
Для добавления события клика на компонент используется следующий код: componentProvider.setIntentAgent(ResourceTable.Id_more, getStartAbilityIntentAgent(context)), где метод getStartAbilityIntentAgent имеет следующий код:
```private static IntentAgent getStartAbilityIntentAgent(Context context) {
Intent intent = new Intent();
Operation operation = new Intent.OperationBuilder()
.withDeviceId("")
.withBundleName("com.example.myohoscard")
.withAbilityName("com.example.myohoscard.MainAbility")
.build();
intent.setOperation(operation);
List<Intent> intentList = new ArrayList<>();
intentList.add(intent);
List<IntentAgentConstant.Flags> flags = new ArrayList<>();
flags.add(IntentAgentConstant.Flags.UPDATE_PRESENT_FLAG);
IntentAgentInfo paramsInfo =
new IntentAgentInfo(200, IntentAgentConstant.OperationType.START_ABILITY, flags, intentList, null);
return IntentAgentHelper.getIntentAgent(context, paramsInfo);
}```
#### 6、Окончательный результат реализации

#### 7、Ссылки на код
[https://gitee.com/chinasoft6_ohos/my-ohos-card](https://gitee.com/chinasoft6_ohos/my-ohos-card)
Автор: Чэнь Цяоинь
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )