Présentation du cadre de routage Alibaba

Les sauts de page Android sont généralement effectués en spécifiant directement le nom du composant avec une intention, mais lorsque plusieurs modules sont développés, cette méthode rend le couplage de chaque module sérieux, le code est trop intrusif et l'objectif de la séparation complète des modules ne peut pas être atteint. Vous devez utiliser une intention implicite pour terminer le saut de page, c'est-à-dire le routage de page. ARouter est une solution de routage Android.

Simple à utiliser

1. Ajouter des dépendances et une configuration

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. Ajouter des annotations

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

3. Initialisez le SDK

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

4. Lancer une opération de routage

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

Notez que si vous souhaitez transmettre un objet personnalisé, vous devez implémenter la sérialisation et la désérialisation 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);
    }
}

Saut d'URL

Le saut de page d'ARouter prend également en charge le saut d'URI, tant que le chemin est correct, vous pouvez passer à l'interface cible, nous pouvons donc également sauter de la manière suivante lors du saut à l'interface:

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

Le schéma et l'hôte peuvent être spécifiés arbitrairement selon nos besoins.

La façon la plus importante de l'utiliser est de passer de la page Web à l'APP:

// 新建一个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 cette façon, les personnes qui passent de la page Web à l'APP passeront le filtre SchameFilterActivity, puis elle passeront à la véritable activité.

Les liens de saut de page Web sont les suivants:

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

Vous pouvez également ajouter des paramètres derrière la page Web:

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

Ensuite, initialisez les paramètres par les méthodes suivantes:

@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 + "");

    }
}

Notez que les paramètres obtenus de cette manière sont des paramètres transmis via l'url, qui sont les paramètres portés par les données, non directement portés par l'intention. La méthode d'acquisition d'origine est la suivante:

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

Mais les données obtenues par la méthode originale de saut d'ARouter seront vides. L'URI de saut peut être obtenu comme suit:

getIntent().getStringExtra(ARouter.RAW_URI)

En fait, ARouter envoie la chaîne d'uri à l'interface suivante via le bundle.

Blocage de page

Définissez d'abord un intercepteur:

@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)
    {

    }
}

Spécifiez ensuite l'intercepteur dans l'activité:

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

De cette façon, lors du saut vers cette Activité, il sera intercepté par l'intercepteur pour décider s'il faut transférer pour continuer le saut:

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"));
    }
});

Vous pouvez également configurer davantage d'informations supplémentaires sur la page cible à traiter par l'intercepteur. Par exemple, une interface peut avoir besoin de se connecter et de lier un numéro de téléphone mobile, vous pouvez écrire comme suit:

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

Jugez ensuite dans l'intercepteur:

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

Gestion de groupe

ARouter gère le chemin de routage des pages en groupes. Par défaut, le chemin que nous écrivons est le nom du groupe, par exemple: le
@Route(path = "/test/SecondActivity")nom du groupe est test, ce qui explique également pourquoi le chemin précédent doit être écrit sur au moins deux niveaux car le nom du groupe est Pour des chemins spécifiques, un paquet ne sera initialisé que lorsqu'un certain chemin dans le paquet est accédé pour la première fois.

Il peut également être groupé manuellement comme suit:

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

Après avoir formulé le groupe, vous devez spécifier le saut de groupe:

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

ARouter ne recommande pas de spécifier manuellement des groupes.

Remarque: ARouter autorise plusieurs groupes dans un module, mais n'autorise pas le même groupe dans plusieurs modules, ce qui entraînera des conflits dans le fichier de mappage.

Publié 19 articles originaux · loué 8 · visites 4041

Je suppose que tu aimes

Origine blog.csdn.net/u014068277/article/details/81269474
conseillé
Classement