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

OSCHINA-MIRROR/luckybilly-CC

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
README-en-US.md 12 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
gitlife-traslator Отправлено 30.11.2024 20:54 0bd0095

CC: Component Caller (Modularization Architecture for Android)

中文文档

Join the chat at https://gitter.im/billy_home/CC

Name CC cc-register
Version Download Download

Demo Download

Демо показывает, как CC работает с компонентом в основном приложении или нет. Это выглядит следующим образом при запуске обоих приложений на вашем устройстве и запуске демонстрационного приложения.

Примечание: вызов между приложениями совместим только для разработки. Вам нужно включить разрешение «автозапуск» для Demo_B, чтобы оно работало, если процесс Demo_B не активен.

image

Что изменилось?

— Простота использования, всего 4 шага: 1. Добавьте плагин AutoRegister в classpath в projectRoot/build.gradle. 2. Добавьте файл gradle apply в module/build.gradle. 3. Реализуйте класс компонента для IComponent в модуле. * Укажите имя для этого компонента в методе getNae(). * Вызовите CC.sendCCResult(cc.getCallId, CCResule.success()) в методе onCall(cc). 4. Затем вы можете вызвать этот компонент в любом месте вашего приложения: * CC.obtainBuilder("component_name").build().call(). * CC.obtainBuilder("component_name").build().callAsync().

— Богатые возможности: * Поддержка межкомпонентного вызова (не только маршрутизация активности, вызов и обратный вызов для почти всех инструкций). * Поддержка вызова компонентов, связанных с жизненным циклом Activity и Fragment (требуется: уровень API Android >= 14, версия библиотеки поддержки >= 5.1.0). * Поддержка межприкладного вызова компонентов (разработка и внедрение компонентов могут выполняться отдельно как приложение). * Поддержка переключения и настройки разрешений вызова между приложениями (соответствует требованиям безопасности разных уровней, статус по умолчанию: включён и не требует разрешения). * Синхронный и асинхронный вызов. * Синхронная и асинхронная реализация компонентов. * Метод вызова не ограничен реализацией (например, асинхронная реализация другого компонента может быть вызвана синхронно. Примечание: не используйте длительные операции в основном потоке). * Поддержка добавления пользовательских перехватчиков (выполняются в порядке добавления). * Настройка тайм-аута (в миллисекундах, 0: без тайм-аута, синхронный вызов установлен по умолчанию на 1000 мс). * Ручная отмена. * Автоматическая регистрация компонентов (IComponent) во время компиляции без ручного ведения реестра компонентов (реализовано с использованием ASM для изменения байт-кода). * Динамическая регистрация и отмена регистрации компонентов (IDynamicComponent). * Поддержка объектов не основных типов, таких как передача фрагментов между компонентами. * Попытка решить проблему сбоя, вызванного неправильным использованием: * Сбой вызова компонента, обратного вызова и реализации компонента перехватывается внутри фреймворка CC. * Объект CCResult синхронного возврата или асинхронного обратного вызова не должен быть нулевым, чтобы избежать нулевого указателя.

— Низкая стоимость преобразования исходного кода в CC. Некоторые люди беспокоятся о том, что преобразование кода в старом проекте в высокой степени связывания кода слишком дорого. CC может решить эту проблему всего за 2 шага:

  1. Создайте класс компонента (класс реализации IComponent). CC.cancel(callId)

// устанавливаем контекст для CC CC.obtainBuilder("demo.ComponentA")...setContext(context)...build().callAsync()

// CC автоматически отменится при уничтожении активности CC.obtainBuilder("demo.ComponentA")...cancelOnDestroyWith(activity)...build().callAsync()

// CC автоматически отменится при разрушении фрагмента CC.obtainBuilder("demo.ComponentA")...cancelOnDestroyWith(fragment)...build().callAsync()

// задаём имя действия CC CC.obtainBuilder("demo.ComponentA")...setActionName(actionName)...build().callAsync()

// задаём таймаут CC в миллисекундах CC.obtainBuilder("demo.ComponentA")...setTimeout(1000)...build().callAsync()

// добавляем внешние параметры CC.obtainBuilder("demo.ComponentA")...addParam("name", "billy").addParam("id", 12345)...build().callAsync()

// создаём успешный CCResult CCResult.success(key1, value1).addData(key2, value2)

// создаём неудачный CCResult CCResult.error(message).addData(key, value)

// отправляем CCResult вызывающему (необходимо убедиться, что этот метод вызывается для каждого onCall(cc)) CC.sendCCResult(cc.getCallId(), ccResult)

// получаем результат CC: успех или нет ccResult.isSuccess()

// код успеха (0: успех, <0: неудача, 1: компонент достигнут, но результат неудачен) ccResult.getCode()

// получаем сообщение об ошибке ccResult.getErrorMessage()

// получаем внешние данные Map<String, Object> data = ccResult.getDataMap(); if (data != null) { Object value = data.get(key) }

Список кодов CCResult:

код статус ошибки
0 успех
1 бизнес-процесс не удался в компоненте
-1 ошибка по умолчанию. пока не используется
-2 имя компонента пусто
-3 CC.sendCCResult (callId, null) или перехватчик возвращает null
-4 во время CC возникло исключение
-5 для указанного component_name не найден объект компонента
-6 контекст равен нулю и получение приложения не удалось из-за отражения
-7 сбой подключения во время CC между приложениями
-8 CC отменён
-9 CC превысил таймаут
-10 component.onCall (cc) вернул false, автобус не нашёл CCResult

Пользовательские перехватчики:

  1. Создайте класс, который реализует интерфейс ICCInterceptor.
  2. Вызовите метод chain.proceed(), чтобы продолжить цепочку вызовов и не блокировать CC.
  3. Перед вызовом chain.proceed() можно изменить параметры объекта CC.
  4. После вызова метода chain.proceed() вы можете изменить CCResult.

Смотрите демонстрацию: MissYouInterceptor.java.

Регистрация/отмена регистрации динамического компонента:

Определение: В отличие от статического компонента (IComponent), который автоматически регистрируется в ComponentManager во время компиляции, динамические компоненты не регистрируются автоматически и работают через ручную регистрацию/отмену регистрации.

  1. Динамическим компонентам необходимо реализовать интерфейсы: IDynamicComponent.
  2. Необходимо вручную вызвать CC.registerComponent (component), аналогично динамической регистрации BroadcastReceiver.
  3. Необходимо вручную вызвать CC.unregisterComponent (компонент), аналогично динамическому отключению BroadcastReceiver.
  4. Другое использование аналогично статическим компонентам.

В модуле может быть несколько компонентов:

В модуле можно иметь несколько классов реализации интерфейса IComponent (или интерфейса IDynamicComponent). Компоненты IComponent автоматически регистрируются в классе управления компонентами ComponentManager во время компиляции. IDynamicComponents — нет.

Компонент может обрабатывать несколько действий:

В методе onCall (CC cc) получает действия для обработки отдельно через cc.getActionName().

См.: ComponentA.

Автоматическая регистрация пользовательского ActionProcessor в компонент:

См.: ComponentB и cc-settings-demo.gradle.

Опубликовать ( 0 )

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

1
https://api.gitlife.ru/oschina-mirror/luckybilly-CC.git
git@api.gitlife.ru:oschina-mirror/luckybilly-CC.git
oschina-mirror
luckybilly-CC
luckybilly-CC
master