Inicio rápido y uso de la creación de componentes / modularización: el uso básico del marco de enrutamiento de Alibaba ARouter.

Prefacio : Este artículo modular y en componentes se presentará en dos artículos. Algunas personas pueden pensar que ya hay artículos en Internet, entonces, ¿por qué escribirlos? Primero: para registrar la propia normalidad, se puede considerar como una nota. Segundo: Aunque hay buenos artículos en Internet, recientemente leí un artículo que tiene más de 150 me gusta, pero la introducción es vaga y se omiten muchos puntos de conocimiento. El objetivo de este artículo es permitirle comenzar rápidamente, comprender y utilizar.

Esta explicación modular / de componentes se divide en 2 artículos (primero debe comprender ARouter o un marco de enrutamiento de terceros):
1. El uso básico del marco de enrutamiento de Alibaba ARouter
2. La componenteización de Android a través de la administración de gradle; y cooperar con ARouter , Salta y cambia a voluntad

Por qué utilizar un marco de enrutamiento aquí Para permitir que los módulos se comuniquen entre sí, por ejemplo, su proyecto presenta el Módulo A. Al mismo tiempo, se introdujo el Módulo B. El proyecto puede acceder a A y B al mismo tiempo. Pero, ¿qué pasa si A quiere visitar B y B quiere visitar A? En este momento, se necesita el marco de enrutamiento para resolverlo. Este es solo un aspecto.

1. Agregar dependencias

Primero coloque la

etiqueta de dependencias build.gradle de la aplicación de dirección github de ARouter más

 implementation 'com.alibaba:arouter-api:1.3.1'
 annotationProcessor 'com.alibaba:arouter-compiler:1.1.4'


Agregue javaCompileOptions a defaultConfig bajo la etiqueta de Android:

android {
    
    
    compileSdkVersion 28
    defaultConfig {
    
    
        ...
        javaCompileOptions {
    
    
            annotationProcessorOptions {
    
    
                arguments = [moduleName: project.getName()]
            }
        }

    }
    
}

2. Inicialización

Inicialice en la aplicación, recuerde liberar la versión online, para cerrar el log y depurar, el código es el siguiente:

public class MyApplication extends Application {
    
    
    //ARouter 调试开关
    private boolean isDebugARouter = true;

    @Override
    public void onCreate() {
    
    
        super.onCreate();
        context = this;
        if (isDebugARouter) {
    
    
            //下面2行必须卸载ARouter init 之间,否则无效
            //打印日志
            ARouter.openLog();
            //开启调试模式(如果在InstantRun的模式下必须开启,线上必须关闭)
            ARouter.openDebug();
        }

        // 官方建议在Application中初始化
        ARouter.init(this);
    }

    @Override
    public void onTerminate() {
    
    
        super.onTerminate();
        ARouter.getInstance().destroy();
    }

}


Al mismo tiempo, el uso de ARouter es un poco como Dagger2, necesitas llamar a ARouter.getInstance (). Inject (Object obj); lo encapsulamos en Base:

public abstract class BaseActivity extends AppCompatActivity {
    
    
    //省略部分代码,便于理解
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
    
    
        super.onCreate(savedInstanceState);
        setContentView(getContentViewId());
        ARouter.getInstance().inject(this);
    }
}

3. El uso de @Route

En la Actividad o Fragmento que usamos. Use la anotación @Route, y path = "/ x / y", x es el nombre del paquete (solo tome el último dígito) e y es el nombre de la clase actual:

@Route(path = "/myapplication/MainActivity")
public class MainActivity extends BaseActivity {
    
    
    
}

4. Saltar entre actividades en ARouter

El salto en Activity y Activity solo necesita llamar al siguiente código, la ruta en la compilación es la ruta que marcamos con @Route path:

ARouter.getInstance().build("/myapplication/MainActivity").navigation();

Del código anterior, encontramos. La ruta "/ myapplication / MainActivity" debe ser administrada por una clase constante, de lo contrario sería problemático encontrarla así, como sigue:

public final class Constance {
    
    
    public static final String ACTIVITY_PATH_MAIN = "/myapplication/MainActivity";
}


Además del salto de ruta aquí, de sus tipos de parámetros, también puede ver los saltos de Uri:

        Uri uri = Uri.parse(Constance.ACTIVITY_PATH_MAIN);
        ARouter.getInstance().build(uri).navigation();

5. Saltar con parámetros y obtener parámetros

Saltar con parámetros

Simplemente siga el .withString (), que contiene todos los tipos que desea pasar

ARouter.getInstance()
                .build("/myapplication/MainActivity")
                .withString("name", "lihang")
                .withInt("age", 27)
                .withSerializable("human", new Person("力哈", "11"))
                .navigation();

Obtener parámetros

En la página Obtener parámetros, tenga en cuenta que hay un gran agujero aquí:

@Route(path = "/myapplication/SimpleActivity")
public class SimpleActivity extends BaseActivity {
    
    
    @Autowired()
    String name;
    @Autowired(name = "age")
    int mAge;
    //    @Autowired(name = "human")这里注意,如果是传Serializable,注解是得不到的。除非是Paceable
    Person mPerson;

    @Override
    public int getContentViewId() {
    
    
        return R.layout.activity_simple;
    }

    @Override
    public void progressLogic() {
    
    
//        mPerson = (Person) getIntent().getSerializableExtra("human");
    }
}

Hay 3 formas de obtener parámetros aquí:

  • Después de que se utiliza la anotación @Autowired, el valor a continuación es la clave para pasar el valor entre.
@Autowired()
String name;
  • Después de usar la anotación @Autowired, name = key, name es igual a la clave que se pasa entremedio, y el nombre del parámetro a continuación es arbitrario
@Autowired(name = "age")
int mAge;
  • Hay algo especial con la serialización aquí. Si es un tipo Parcelable, puede usar el método anterior para obtenerlo. Pero si es un tipo serializable, encontrará que no hay forma de obtenerlo. Pero aquí también podemos conseguirlo con nuestro tradicional getIntent
mPerson = (Person) getIntent().getSerializableExtra("human");

6. Salta con animación

Antes de que queramos traer el salto de animación, necesitamos usar overridePendingTransition (int anim_in, int anim_out); También se proporciona aquí, pero hay un gran pozo:

ARouter.getInstance()
                .build(Constance.ACTIVITY_PATH_SIMPLE)
                .withTransition(R.anim.alpha_activity_in, R.anim.alpha_activity_out)
                //navigation里,一定要加上当前的Context,不然动画不起效
                .navigation(MainActivity.this, 99);


Al mismo tiempo, ARouter también proporciona una nueva versión de animación, pero requiere api> = 16. El efecto sigue siendo muy bueno:

        if (Build.VERSION.SDK_INT >= 16) {
    
    
            ActivityOptionsCompat compat = ActivityOptionsCompat.
                    makeScaleUpAnimation(btn, btn.getWidth(), btn.getHeight(), 0, 0);
            ARouter.getInstance()
                    .build(Constance.ACTIVITY_PATH_SIMPLE)
                    .withOptionsCompat(compat)
                    .navigation();
        }else {
    
    
            ToastUtils.showToast("api <16,不支持新版动画");
        }

7, similar a startActivityForResult (Intent intent, int requestCode) en Activity;

Saltar con requestCode

También está en .navigation (), siempre que traiga requestCode, está bien. Entonces onActivityResult es lo mismo que el uso normal.

ARouter.getInstance()
                .build(Constance.ACTIVITY_PATH_SIMPLE)
                .navigation(Context context, int requestCode);

setResult vuelve a la interfaz, lo leíste bien, ¡es tan complicado!

        Postcard postcard = ARouter.getInstance().build(Constance.ACTIVITY_PATH_MAIN);
        LogisticsCenter.completion(postcard);
        Class<?> destination = postcard.getDestination();
        Intent intent = new Intent(SimpleActivity.this, destination);
        setResult(1, intent);
        finish();

8. Uso de fragmentos

Dije que tanto la Actividad como el Fragmento deben estar marcados con @Route y path.
El uso de Fragmento aquí es el mismo que Actividad, pero la única diferencia es que Actividad es un salto y Fragmento es una instancia de instanciar Fragmen, como sigue:

//记得要强转一下,这里传值什么的和Activity的用法一样。
HomeFragment homeFragment = (HomeFragment)ARouter.getInstance().build(Constance.Fragment_PATH_SIMPLE).navigation();

9. El uso de interceptores

Primero veamos un fragmento de código interceptor:

@Interceptor(priority = 1)
public class FirstInterceptor implements IInterceptor {
    
    
    @Override
    public void process(Postcard postcard, InterceptorCallback callback) {
    
    
        if (postcard.getPath().equals(Constance.ACTIVITY_PATH_SIMPLE)){
    
    
            LogUtils.i("ARouter拦截器", "FirstInterceptor 开始拦截 ======");
        }
        callback.onContinue(postcard);
    }
    @Override
    public void init(Context context) {
    
    
        LogUtils.i("ARouter拦截器", "first init");
    }
}

1. El uso de interceptores es muy peculiar, siempre que escriba esta clase en su código, funcionará. Se estima que @Interceptor marcó que apt ha hecho mucho por nosotros.

2. Primera marca con @Interceptor, (prioridad = 1) prioridad, cuanto menor sea la prioridad, antes se ejecutará.

3. Implemente la interfaz IInterceptor. Se implementan dos métodos: init (), process ().

4. El método init () se ejecuta primero cuando se inicia el proyecto, y el método process () se llama cuando la actividad salta

5. Si queremos agregar algunas condiciones de selección atractivas al interceptor, podemos pasar Postal

6. Tenga en cuenta que mientras el interceptor esté configurado, callback.onContinue (postal) no se llamará aquí; se bloqueará en el interceptor actual. Por supuesto, el salto está atascado en la página actual.


10. Agregue monitoreo al saltar y úselo con interceptores

Vaya directamente al código. Comentar en el código

        ARouter.getInstance()
                .build(Constance.ACTIVITY_PATH_SIMPLE)
                .navigation(MainActivity.this, new NavigationCallback() {
    
    
                    @Override
                    public void onFound(Postcard postcard) {
    
    
                        //路由目标被发现时调用(Activity执行跳转代码,第一个执行)
                        //group 为路径的组。如果不自定义,会默认成path的/x/y的x
                        //group 可以自定义,如:@Route(path = Constance.ACTIVITY_PATH_MAIN,group = Constance.GROUP_FIRST)
                        //当然自定义组之后,跳转的时候要带上组名。
                        String group = postcard.getGroup();
                        //path 为全路径@Route(path = Constance.ACTIVITY_PATH_MAIN)
                        String path = postcard.getPath();
                        LogUtils.i("ARouter拦截器", "onFound ------>  group == " + group + "    " + "path == " + path);
                    }

                    @Override
                    public void onArrival(Postcard postcard) {
    
    
                        //路由到达后调用(注意这里是所有拦截器执行完之后才会调用)
                        String group = postcard.getGroup();
                        String path = postcard.getPath();
                        LogUtils.i("ARouter拦截器", "onArrival ------>  group == " + group + "    " + "path == " + path);
                    }

                    @Override
                    public void onLost(Postcard postcard) {
    
    
                        //路由被丢失时调用
                        LogUtils.i("ARouter拦截器", "onLost");
                    }

                    @Override
                    public void onInterrupt(Postcard postcard) {
    
    
                        //路由被拦截时调用
                        LogUtils.i("ARouter拦截器", "onInterrupt");

                    }

                });

Conclusión: así es como se usa ARouter. Actualmente en un loco aprendizaje. Si tiene ideas afines o quiere estudiar conmigo, agregue el grupo QQ: 209010674. También se está preparando para un mejor acceso el próximo año. Si también te ayuda, dame un me gusta y anímame.

Supongo que te gusta

Origin blog.csdn.net/leol_2/article/details/100700079
Recomendado
Clasificación