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

OSCHINA-MIRROR/mirrors-ARouter

Клонировать/Скачать
README.md 20 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
gitlife-traslator Отправлено 01.12.2024 02:10 69fdc1c

A framework for assisting in the renovation of Android app componentization

中文文档

Join the chat at https://gitter.im/alibaba/ARouter Hex.pm

Lastest version

Модуль arouter-api arouter-compiler arouter-register arouter-idea-plugin
Версия Download Download Download as plugin

Demo

Demo apkDemo Gif

I. Feature

  1. Поддерживает прямой анализ стандартных URL для переходов и автоматическое внедрение параметров на целевые страницы.
  2. Поддержка мультимодульности.
  3. Поддержка перехватчиков.
  4. Поддержка внедрения зависимостей.
  5. Поддержка InstantRun.
  6. Поддержка MultiDex.
  7. Группировка сопоставлений по группам, многоуровневое управление, инициализация по требованию.
  8. Позволяет пользователям указывать глобальные и локальные стратегии понижения.
  9. Активность, перехватчик и сервис могут быть автоматически зарегистрированы в рамках фреймворка.
  10. Поддержка нескольких способов настройки анимации перехода.
  11. Поддержка фрагментов.
  12. Полная поддержка Kotlin (см. раздел «Другое» № 2).
  13. Поддержка генерации документации по маршрутам.
  14. Предоставление плагина IDE для быстрой навигации к целевому классу.
  15. Поддержка инкрементной обработки аннотаций.
  16. Поддержка регистрации метаданных маршрута динамически.

II. Классический случай

  1. Переход с внешних URL на внутренние страницы и анализ параметров.
  2. Переходы и развязка между мультимодулями.
  3. Перехват процесса перехода, обработка логина, статистики и другой логики.
  4. Межмодульная коммуникация, развязка компонентов через IoC.

III. Конфигурация

  1. Добавление зависимостей и конфигураций.

    android {
        defaultConfig {
            ...
            javaCompileOptions {
                annotationProcessorOptions {
                    arguments = [AROUTER_MODULE_NAME: project.getName()]
                }
            }
        }
    }
    
    dependencies {
        // Замените на последнюю версию
        compile 'com.alibaba:arouter-api:?'
        annotationProcessor 'com.alibaba:arouter-compiler:?'
        ...
    }
    // Старая версия плагина Gradle (< 2.2), вы можете использовать плагин apt, см. «Другое» #1
    // Конфигурация Kotlin см. «Другое» #2
  2. Добавьте аннотации.

    // Добавьте аннотации на страницах, поддерживающих маршрутизацию (обязательно)
    // Путь здесь должен иметь как минимум два уровня : /xx/xx
    @Route(path = "/test/activity")
    public class YourActivity extend Activity {
        ...
    }
  3. Инициализируйте SDK.

    if (isDebug()) {           // Эти две строки должны быть написаны перед init, иначе эти конфигурации будут недействительны в процессе init
        ARouter.openLog();     // Печать журнала
        ARouter.openDebug();   // Включить режим отладки (Если вы работаете в режиме InstantRun, вы должны включить режим отладки! Онлайн-версия должна быть закрыта, иначе существует риск безопасности)
    }
    ARouter.init(mApplication); // Как можно раньше, рекомендуется инициализировать в Application
    ``` **Маршрутизация**
    
// 1. Простой переход внутри приложения (переход через URL в «Расширенном использовании»)
ARouter.getInstance().build("/test/activity").navigation();

// 2. Переход с параметрами
ARouter.getInstance()
    .build("/test/1")
    .withLong("key1", 666L)
    .withString("key3", "888")
    .withObject("key4", new Test("Jack", "Rose"))
    .navigation();

5. Добавление запутанных правил (если Proguard включён)

-keep public class com.alibaba.android.arouter.routes.**{*;}
-keep public class com.alibaba.android.arouter.facade.**{*;}
-keep class * implements com.alibaba.android.arouter.facade.template.ISyringe{*;}

# Если вы используете метод byType для получения сервиса, добавьте следующие правила для защиты интерфейса:
-keep interface * implements com.alibaba.android.arouter.facade.template.IProvider

# Если используется однотипная инъекция, то есть интерфейс не определён для реализации IProvider, необходимо добавить следующие правила для защиты реализации
# -keep class * реализует com.alibaba.android.arouter.facade.template.IProvider

6. Использование пользовательского плагина Gradle для автозагрузки таблицы маршрутизации

apply plugin: 'com.alibaba.arouter'

buildscript {
    repositories {
        mavenCentral()
    }

    dependencies {
        // Замените на последнюю версию
        classpath "com.alibaba:arouter-register:?"
    }
}

Необязательно, используйте плагин регистрации, предоставленный ARouter, для автоматической загрузки таблицы маршрутизации (на основе AutoRegister). По умолчанию ARouter будет сканировать файлы dex. Использование плагина gradle для автоматической регистрации может сократить время инициализации, следует отметить, что плагин должен использоваться с API выше 1.3.0!

7. Используйте плагин IDE для быстрой навигации к целевому классу (необязательно)

Найдите ARouter Helper в магазине плагинов Android Studio или напрямую загрузите zip-пакет установки arouter-idea-plugin, указанный в Последней версии над документацией. После установки плагина без каких-либо настроек вы можете найти значок в начале кода перехода. (navigation) Нажмите на значок, чтобы перейти к целевому классу, который идентифицирует путь в коде.

IV. Расширенное использование

  1. Перейти по URL
// Создать новую активность для мониторинга событий схемы, а затем напрямую передать URL в ARouter
public class SchemeFilterActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        Uri uri = getIntent().getData();
        ARouter.getInstance().build(uri).navigation();
        finish();
    }
}

AndroidManifest.xml

<activity android:name=".activity.SchemeFilterActivity">
    <!-- Scheme -->
    <intent-filter>
        <data
            android:host="m.aliyun.com"
            android:scheme="arouter"/>

        <action android:name="android.intent.action.VIEW"/>

        <category android:name="android.intent.category.DEFAULT"/>
        <category android:name="android.intent.category.BROWSABLE"/>
    </intent-filter>
</activity>
  1. Разобрать параметры в URL
// Объявить поле для каждого параметра и аннотировать его @Autowired
@Route(path = "/test/activity")
public class Test1Activity extends Activity {
    @Autowired
    public String name;
    @Autowired
    int age;
    @Autowired(name = "girl") // Сопоставление разных параметров в URL по имени
    boolean boy;
    @Autowired
    TestObj obj; // Поддержка анализа пользовательских объектов, используя json в URL

    @Override
    protected void onCreate(Bundle savedInstanceState) {
``` **1. Создание и внедрение ARouter**

super.onCreate(savedInstanceState); ARouter.getInstance().inject(this);

// ARouter автоматически установит значения полей Log.d("param", name + age + boy); }


**2. Использование ARouter для передачи параметров**

// Если вам нужно передать пользовательский объект, создайте новый класс (не класс пользовательского объекта), реализуйте интерфейс SerializationService и используйте аннотацию @Route, например: @Route(path = "/yourservicegroupname/json") public class JsonServiceImpl implements SerializationService { @Override public void init(Context context) {

}

@Override
public <T> T json2Object(String text, Class<T> clazz) {
    return JSON.parseObject(text, clazz);
}

@Override
public String object2Json(Object instance) {
    return JSON.toJSONString(instance);
}

}


**3. Объявление перехватчика (перехват процесса перехода, АОП)**

```java
// Более классическое применение — обработка событий входа во время перехода, чтобы не было необходимости повторять проверку входа на целевой странице.
// Перехватчики будут выполняться между переходами, несколько перехватчиков будут выполняться в порядке приоритета
@Interceptor(priority = 8, name = "test interceptor")
public class TestInterceptor implements IInterceptor {
    @Override
    public void process(Postcard postcard, InterceptorCallback callback) {
        ...
        // Нет проблем! передаём управление фреймворку
        callback.onContinue(postcard);  

        // Прерываем процесс маршрутизации
        // callback.onInterrupt(new RuntimeException("Something exception"));      

        // Вышеупомянутые два типа должны вызывать хотя бы один из них, иначе маршрутизация не продолжится
    }

    @Override
    public void init(Context context) {
        // Инициализация перехватчика, этот метод будет вызван при инициализации sdk, он будет вызван только один раз
    }
}

4. Обработка результатов перехода

// Можно получить результат одного перехода
ARouter.getInstance().build("/test/1").navigation(this, new NavigationCallback() {
    @Override
    public void onFound(Postcard postcard) {
    ...
    }

    @Override
    public void onLost(Postcard postcard) {
    ...
    }
});

5. Пользовательская глобальная стратегия понижения

// Реализуйте интерфейс DegradeService
@Route(path = "/xxx/xxx")
public class DegradeServiceImpl implements DegradeService {
    @Override
    public void onLost(Context context, Postcard postcard) {
        // Сделайте что-нибудь.
    }

    @Override
    public void init(Context context) {

    }
}

6. Развязка через внедрение зависимостей: управление сервисами — предоставление сервисов

// Объявление интерфейса, другие компоненты получают экземпляр службы через интерфейс
public interface HelloService extends IProvider {
    String sayHello(String name);
}

@Route(path = "/yourservicegroupname/hello", name = "test service")
public class HelloServiceImpl implements HelloService {

    @Override
    public String sayHello(String name) {
        return "hello, " + name;
    }

    @Override
    public void init(Context context) {

    }
}

7. Развязка через внедрение зависимостей: Управление сервисами — обнаружение сервисов

public class Test {
    @Autowired
    HelloService helloService;

    @Autowired(name = "/yourservicegroupname/hello")
    HelloService helloService2;

    HelloService helloService3;

    HelloService helloService4;

    public Test() {
        ARouter.getInstance().inject(this);
    }

    public void testService() {
        // 1. Используйте внедрение зависимостей для обнаружения служб, аннотируйте поля аннотациями
        helloService.sayHello("Vergil");
        helloService2.sayHello("Vergil");

        // 2. Обнаружение служб с помощью поиска зависимостей
``` **Следующие два метода  byName и byType**
helloService3 = ARouter.getInstance().navigation(HelloService.class);
helloService4 = (HelloService) ARouter.getInstance().build("/yourservicegroupname/hello").navigation();
helloService3.sayHello("Vergil");
helloService4.sayHello("Vergil");

}


**8. Сервис предварительной обработки**  

```java
@Route(path = "/xxx/xxx")
public class PretreatmentServiceImpl implements PretreatmentService {
    @Override
    public boolean onPretreatment(Context context, Postcard postcard) {
        // Сделайте что-нибудь перед навигацией, если вам нужно обработать навигацию самостоятельно, метод возвращает false
    }

    @Override
    public void init(Context context) {

    }
}

9. Динамическая регистрация метаданных маршрута

Применимо к приложениям с подключаемыми архитектурами или некоторым сценариям, где необходимо динамически регистрировать информацию о маршрутизации. Динамическую регистрацию можно выполнить через интерфейс, предоставляемый ARouter. Целевая страница и сервис не должны быть помечены аннотацией @Route.

Только информация о маршрутах одной группы может быть зарегистрирована в одном пакете.

ARouter.getInstance().addRouteGroup(new IRouteGroup() {
    @Override
    public void loadInto(Map<String, RouteMeta> atlas) {
        atlas.put("/dynamic/activity", // path
            RouteMeta.build(
                RouteType.ACTIVITY, // Route type
                TestDynamicActivity.class, // Target class
                "/dynamic/activity", // Path
                "dynamic", // Group
                0, // not need
                0 // Extra tag, Used to mark page feature
            )
        );
    }
});

V. Дополнительные функции

  1. Другие настройки при инициализации
ARouter.openLog(); // Открыть журнал
ARouter.openDebug(); // При использовании InstantRun необходимо открыть этот переключатель и отключить его после выхода в онлайн. В противном случае существует риск для безопасности.
ARouter.printStackTrace(); // Печать стека потоков при печати журналов
  1. Описание API
// Создать стандартный запрос маршрута
ARouter.getInstance().build("/home/main").navigation();

// Создать стандартный запрос маршрута через URI
Uri uri;
ARouter.getInstance().build(uri).navigation();

// Создать стандартный запрос маршрута, startActivityForResult
// Первый параметр должен быть Activity, а второй параметр — RequestCode
ARouter.getInstance().build("/home/main", "ap").navigation(this, 5);

// Передать Bundle напрямую
Bundle params = new Bundle();
ARouter.getInstance()
    .build("/home/main")
    .with(params)
    .navigation();

// Установить флаг
ARouter.getInstance()
    .build("/home/main")
    .withFlags()
    .navigation();

// Для фрагмента
Fragment fragment = (Fragment) ARouter.getInstance().build("/test/fragment").navigation();

// Перенести объект
ARouter.getInstance()
    .withObject("key", new TestObj("Jack", "Rose"))
    .navigation();

// Подумайте, что интерфейса недостаточно, вы можете напрямую установить параметр в Bundle
ARouter.getInstance()
        .build("/home/main")
        .getExtra();

// Анимация перехода (обычный режим)
ARouter.getInstance()
    .build("/test/activity2")
    .withTransition(R.anim.slide_in_bottom, R.anim.slide_out_bottom)
    .navigation(this);

// Анимация перехода (API16+)
ActivityOptionsCompat compat = ActivityOptionsCompat.
    makeScaleUpAnimation(v, v.getWidth() / 2, v.getHeight() / 2, 0, 0);

// ps. makeSceneTransitionAnimation. При использовании общих элементов необходимо передать текущую активность в методе навигации.

ARouter.getInstance()
    .build("/test/activity2")

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

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

1
https://api.gitlife.ru/oschina-mirror/mirrors-ARouter.git
git@api.gitlife.ru:oschina-mirror/mirrors-ARouter.git
oschina-mirror
mirrors-ARouter
mirrors-ARouter
develop