A framework for assisting in the renovation of Android app componentization
Модуль | arouter-api | arouter-compiler | arouter-register | arouter-idea-plugin |
---|---|---|---|---|
Версия |
Добавление зависимостей и конфигураций.
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
Добавьте аннотации.
// Добавьте аннотации на страницах, поддерживающих маршрутизацию (обязательно)
// Путь здесь должен иметь как минимум два уровня : /xx/xx
@Route(path = "/test/activity")
public class YourActivity extend Activity {
...
}
Инициализируйте 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
, указанный в Последней версии
над документацией. После установки плагина без каких-либо настроек вы можете найти значок в начале кода перехода. () Нажмите на значок, чтобы перейти к целевому классу, который идентифицирует путь в коде.
// Создать новую активность для мониторинга событий схемы, а затем напрямую передать 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>
// Объявить поле для каждого параметра и аннотировать его @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
)
);
}
});
ARouter.openLog(); // Открыть журнал
ARouter.openDebug(); // При использовании InstantRun необходимо открыть этот переключатель и отключить его после выхода в онлайн. В противном случае существует риск для безопасности.
ARouter.printStackTrace(); // Печать стека потоков при печати журналов
// Создать стандартный запрос маршрута
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 )