Introducción al marco de enrutamiento de Alibaba

Los saltos de página de Android generalmente se realizan especificando directamente el nombre del componente con una intención, pero cuando se desarrollan múltiples módulos, este método hará que el acoplamiento de cada módulo sea serio, el código es demasiado intrusivo y no se puede lograr el propósito de la separación completa de los módulos. Necesita usar la intención implícita para completar el salto de página, es decir, el enrutamiento de la página. ARouter es una solución de enrutamiento de Android.

Fácil de usar

1. Agregar dependencias y configuración

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

dependencies {
    // 替换成最新版本, 需要注意的是api
    // 要与compiler匹配使用,均使用最新版可以保证兼容
    compile 'com.alibaba:arouter-api:x.x.x'
    annotationProcessor 'com.alibaba:arouter-compiler:x.x.x'
    ...
}
// 旧版本gradle插件(< 2.2),可以使用apt插件,配置方法见文末'其他#4'
// Kotlin配置参考文末'其他#5'

2. Agregar anotaciones

// 在支持路由的页面上添加注解(必选)
// 这里的路径需要注意的是至少需要有两级,/xx/xx
@Route(path = "/test/activity")
public class YourActivity extend Activity {
    ...
}

3. Inicialice el SDK

if (isDebug()) {           // 这两行必须写在init之前,否则这些配置在init过程中将无效
    ARouter.openLog();     // 打印日志
    ARouter.openDebug();   // 开启调试模式(如果在InstantRun模式下运行,必须开启调试模式!线上版本需要关闭,否则有安全风险)
}
ARouter.init(mApplication); // 尽可能早,推荐在Application中初始化

4. Iniciar la operación de enrutamiento

// 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();

Tenga en cuenta que si desea pasar un objeto personalizado, debe implementar la serialización y deserialización json:

@Route(path = "/service/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);
    }
}

URL Jump

El salto de página de ARouter también admite el salto uri, siempre que la ruta sea correcta, puede saltar a la interfaz de destino, por lo que también podemos saltar de la siguiente manera al saltar a la interfaz:

Uri uri = Uri.parse("arouter://m.aliyun.com/test/Main2Activity");
ARouter.getInstance().build(uri).navigation();

El esquema y el host pueden especificarse arbitrariamente de acuerdo con nuestras necesidades.

La forma más importante de usarlo es al saltar de la página web a la APLICACIÓN:

// 新建一个Activity用于监听Schame事件,之后直接把url传递给ARouter即可
public class SchameFilterActivity 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.SchameFilterActivity">
    <!-- Schame -->
    <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>

De esta manera, cualquiera que salte de la página web a la APLICACIÓN pasará el filtro SchameFilterActivity, y luego saltará a la Actividad real.

Los enlaces de salto de la página web son los siguientes:

<a href="router://m.aliyun.com/test/Main2Activity">跳转</a>

También puede agregar parámetros detrás de la página web:

<a href="router://m.aliyun.com/test/Main2Activity?name=xuyu">跳转</a>

Luego, inicialice los parámetros mediante los siguientes métodos:

@Route(path = "/test/Main2Activity")
public class Main2Activity extends AppCompatActivity
{
    @Autowired
    String name;

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);

        ARouter.getInstance().inject(this);
        Log.e("Main2Activity", name + "");

    }
}

Tenga en cuenta que los parámetros obtenidos de esta manera son parámetros pasados ​​a través de la URL, que son los parámetros transportados por los datos, no directamente transportados por la intención. El método de adquisición original es el siguiente:

getIntent().getData().getQueryParameter("name");

Pero los datos obtenidos por la forma original de ARouter jump estarán vacíos. El uri de salto se puede obtener de la siguiente manera:

getIntent().getStringExtra(ARouter.RAW_URI)

De hecho, ARouter envía la cadena de uri a la siguiente interfaz a través del paquete.

Bloqueo de página

Primero defina un interceptor:

@Interceptor(priority = 8, name = "测试用拦截器")
public class TestInterceptor implements IInterceptor
{
    @Override
    public void process(Postcard postcard, InterceptorCallback callback)
    {
//        callback.onContinue(postcard);
        callback.onInterrupt(new RuntimeException("我觉得有点异常"));
    }

    @Override
    public void init(Context context)
    {

    }
}

Luego especifique el interceptor en la Actividad:

@Route(path = "/test/SecondActivity",priority = 8)

De esta manera, al saltar a esta Actividad, será interceptada por el interceptor para decidir si se transfiere para continuar el salto:

ARouter.getInstance().build("/test/SecondActivity").navigation(FirstActivity.this, new NavigationCallback()
{

    @Override
    public void onInterrupt(Postcard postcard)
    {
        Log.e("FirstActivity", "onInterrupt" + (postcard != null ? postcard.toString() : "null"));
    }
});

También puede configurar más información adicional en la página de destino para que la procese el interceptor. Por ejemplo, una interfaz puede necesitar iniciar sesión y vincular un número de teléfono móvil, puede escribir de la siguiente manera:

//用二进制最低位判断是否登录,次高位判断是否绑定手机号
@Route(path = "/test/SecondActivity",priority = 8,extra=3)

Luego juzgue en el interceptor:

//获取目标页面的extras,注意这里不可以使用postcard.getExtras()
//他是获取传到目标页面bundle信息的方法
int extra=postcard.getExtra()
if(((extra & 2) > 0) & ((extra & 1) > 0));
{
    //目标界面需要登录且绑定手机号
}
if((extra & 2) > 0)
{
    //目标界面仅需要绑定手机号(业务上不应该有这个状态)
}
if((extra & 1) > 0)
{
    //目标界面需要仅登录
}

Gestión de grupo

ARouter administra la ruta de enrutamiento de la página en grupos. Por defecto, la ruta que escribimos es el nombre del grupo, por ejemplo: el
@Route(path = "/test/SecondActivity")nombre del grupo es test, lo que también explica por qué la ruta anterior debe escribirse al menos en dos niveles, porque el nombre del grupo se agrega Para rutas específicas, un paquete solo se inicializará cuando se acceda a una ruta determinada en el paquete por primera vez.

También se puede agrupar manualmente de la siguiente manera:

@Route(path = "/test/1", group = "app")

Después de formular el grupo, debe especificar el salto de grupo:

ARouter.getInstance().build("/test/1", "app").navigation();

ARouter no recomienda especificar grupos manualmente.

Nota: ARouter permite múltiples grupos en un módulo, pero no permite el mismo grupo en múltiples módulos, lo que generará conflictos en el archivo de mapeo.

Publicado 19 artículos originales · elogiado 8 · visitas 4041

Supongo que te gusta

Origin blog.csdn.net/u014068277/article/details/81269474
Recomendado
Clasificación