1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/chinasoft6_ohos-my-ohos-card

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

Проект HarmonyOS: приложение для напоминаний о событиях в виде карточек-напоминаний

1. Проект

Проект представляет собой простое приложение, которое позволяет создавать карточки-напоминания о событиях текущего дня и размещать их на рабочем столе для наглядного просмотра предстоящих дел.

Цель проекта — помочь разработчикам быстро освоить следующие технические аспекты:

  • макет, инициализация, обновление и обработка событий для карточек на JavaScript;
  • макет, инициализация, обновление и обработка событий для карточек на Java.

2. Структура кода

В этом руководстве мы рассмотрим только основной код. Вы можете скачать полный код в разделе «Ссылки».

Структура кода проекта:

  1. java-Util — класс инструментов для работы с данными карточек.
  2. java-widget — контроллер, который управляет карточками. Включает в себя классы javacard2x4 (инициализация и обновление для Java 2×2 и Java 2×4) и jscard2x4 (инициализация и обновление для JavaScript 2×2 и JavaScript 2×4), а также widget (инициализация и обновление для карусельных карточек на JavaScript).
  3. java-CardServiceAbility — сервис для обновления карточек при изменении событий.
  4. java-MainAbility — точка входа приложения, а также операции инициализации и обновления для карточек.
  5. java-ServiceAbility — коммуникационный сервис между JavaScript и Java.
  6. js-default-page — каталог страниц по умолчанию: index (главная страница приложения с отображением событий из календаря) и schedule (страницы добавления, изменения и удаления событий).
  7. js-jscard2x4 — страницы для карточек JavaScript 2×2 и 2×4.
  8. js-widget — страницы для карусельных карточек на JavaScript.
  9. resources-base-layout — файлы шаблонов для карточек: form_grid_pattern_javacard2x4_2_2.xml (для карточек Java 2×2) и form_grid_pattern_javacard2x4_2_4.xml (для карточек Java 2×4).
  10. config.json — конфигурационные файлы для JavaScript, Java и других параметров.

3. Карусельные карточки на JavaScript

1. Создание новой карточки
  1. Правый клик — new — service-widget.
  2. Выбрать шаблон — следующий шаг.
  3. Ввести название карточки, выбрать тип (одиночный выбор) и размер (множественный выбор), нажать finish.
2. Страница по умолчанию
  1. Файл js-widget-pages-index-index.json содержит данные для страницы по умолчанию.
  • data — данные по умолчанию.
  • actions — события маршрутизатора для перехода между приложениями.
  1. Файл js-widget-pages-index-index.css содержит стили для карточки.
  • Аналогично стилям для страниц на JavaScript.
  1. Файл js-widget-pages-index-index.html содержит код для страницы.
  • Используется компонент для поддержки карточек. Подробнее см. Компоненты для карточек.
  • Событие click связано с событием маршрутизатора в файле actions. Здесь это событие используется для перехода на другую страницу приложения. Код: on:click="routerEvent" (без передачи параметров).
3. Инициализация карточки

Инициализация данных для отображения на карточке происходит в методе 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;
}
4. Обновление карточки
  1. Конфигурационный файл config.json позволяет настроить периодическое или автоматическое обновление.
  • В данном случае эта функция не реализована, поэтому обновление не поддерживается.
  1. При добавлении или изменении событий текущего дня данные изменяются, что вызывает срабатывание метода наблюдения за данными в классе StorageUtil.java. Здесь запускается сервис CardServiceAbility. Код:
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、Окончательный результат реализации

![Результат реализации](https://images.gitee.com/uploads/images/2021/0727/143055_cad3de7a_8627638.gif "card_demo.gif")  

#### 7、Ссылки на код
[https://gitee.com/chinasoft6_ohos/my-ohos-card](https://gitee.com/chinasoft6_ohos/my-ohos-card)  

Автор: Чэнь Цяоинь

Комментарии ( 0 )

Вы можете оставить комментарий после Вход в систему

Введение

Простое приложение для добавления событий в календарь, которое генерирует карточки с событиями текущего дня на рабочий стол для наглядного просмотра запланированных дел на текущий день. Развернуть Свернуть
Apache-2.0
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/chinasoft6_ohos-my-ohos-card.git
git@api.gitlife.ru:oschina-mirror/chinasoft6_ohos-my-ohos-card.git
oschina-mirror
chinasoft6_ohos-my-ohos-card
chinasoft6_ohos-my-ohos-card
master