美文网首页
Android基础之Arouter的使用

Android基础之Arouter的使用

作者: 南风知我咦 | 来源:发表于2023-04-05 20:55 被阅读0次

资料

组件化开发的利器

  • 组件化项目存在各个模块之间耦合,通信麻烦的问题 ,,为了解决这个问题,阿里巴巴的开发者就搞出了Arouter这个框架,以解决上述问题.

Arouter 支持模块间的路由、通信、解耦

简单使用

配置

  • 添加依赖和gradle配置
  • 我实在moudle_common中配置的
 defaultConfig {
        minSdk rootProject.ext.minSdkVersion
        targetSdk rootProject.ext.targetSdkVersion

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"


        //ARouter配置
        javaCompileOptions {
            annotationProcessorOptions {
                arguments = [AROUTER_MOUDLE_NAME: project.getName()]
            }
        }

    }


dependencies {
...
    //路由ARouter
    api 'com.alibaba:arouter-api:1.5.2'
    annotationProcessor 'com.alibaba:arouter-compiler:1.5.2'
...
}
  • 初始化
public class MyApplication extends Application {

    @Override
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);
    }

    @Override
    public void onCreate() {
        super.onCreate();
        //初始化音乐播放器
        LocalMediaPlayer.getInstance().setWeakReference(this);
        initARouter();
    }

    /**
     * 初始化ARouter
     */
    private void initARouter() {
        if (BuildConfig.DEBUG){
            ARouter.openLog();
            // 开启调试模式(如果在InstantRun模式下运行,必须开启调试模式!线上版本需要关闭,否则有安全风险)
            ARouter.openDebug();
        }
        ARouter.init(this);
    }

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

简单使用

  • 写一个Constant类统一管理路由地址
/**
 * 路由表
 */
public class ARouterConstant {
    public static final String USB_ACTIVITY = "/com/mj/UsbActivity";
}

依赖注入
  • 在支持路由的页面上添加注解(必选), 这里的路径需要注意的是至少需要有两级,/xx/xx
@Route(path = ARouterConstant.USB_ACTIVITY)
public class TestActivity extends BaseActivity {
}
发起路由操作
  • 应用内简单跳转
        initButton2(R.id.btn_jump2_test_arouter, new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //路由跳转
                ARouter.getInstance().build("/arouter/TestActivity").navigation();
            }
        });
  • 携带参数的跳转
    /**
     * 路由跳转
     */
    private void aRouterJump(){
        //带参数
        ARouter.getInstance().build(ARouterConstant.SECOND_ACTIVITY)
                .withLong("long",123l)
                .withString("string","路由")
                .withObject("object",new TestARouterEntry("时间", TimeUtils.getCurrentTime(TimeUtils.DateMode.SIMPLE_TIME_MODE)))
                .navigation();
    }
混淆
  • 使用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 的方式获取 Service,需要添加下面规则,保护接口
#emmm还没看到这种使用方法呢,这应该是进阶用法吧(这种就是自己定义接口继承自IProvider,然后实现自己的接口的方式使用IProvider)
-keep interface * implements com.alibaba.android.arouter.facade.template.IProvider

#如果使用了 单类注入 即 不顶用接口实现IPrvider,需要要添加规则,保护实现(哦哦 就是直接实现接口IProvider的类,不是通过自己定义接口继承自IProvider,然后在实现自己的接口)
#-keep class * implements com.alibaba.android.arouter.facade.template.IProvider
使用Gradle插件实现路由表的自动加载
  • 额这个没怎么搞懂
IDE插件导航
  • 去插件市场下载ARouter Helper插件
  • 然后就可以方便直接定位你将要跳转的类了,很方便。


    图片.png

进阶用法

URl跳转
  • 通过uri跳转的方式,类似采用Scheme协议跳转,在目标Activity的清单文件中定义指定的scheme,host,path等属性,然后拼接成一个uri对象,就可以跳转到指定的Activity,但是采用之前的方法,我们必须在每一个目标Activity清单中都定义scheme相关参数,要是需要跳转的Activity数量比较多的话,那整个清单文件就会显得比较臃肿,维护起来比较麻烦。-
  • 我们可以在项目中创建一个统一处理Scheme跳转的SchemeActivity作为中转,该Activity不需要布局文件,然后在清单中为该Activity定义scheme和host,如果外部需要跳转时,就采用统一的scheme和host,然后再拼接目标Activity的路劲,这样就可以在新建的SchemeActivity中统一通过ARouter传入接收的uri,进行跳转到指定的Activity
  • 这个是真的叼,只需要定义一个中转的Activity,设置它的清单文件,然后所有的URL都通过它来中转。天才的想法。
  1. 创建一个Scheme协议跳转的中转页面SchemeActivity

/**
 * 协议中转页面
 */
public class SchemeActivity extends AppCompatActivity {

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Uri uri = getIntent().getData();
        ARouter.getInstance().build(uri).navigation();
        finish();
    }
}

  1. 设置清单文件,指定scheme和host
<application>
        <activity android:name=".activity.SchemeActivity">
            <intent-filter>
                <category android:name="android.intent.category.DEFAULT"/>
                <category android:name="android.intent.category.BROWSABLE"/>
                <action android:name="android.intent.action.VIEW"/>
                <data android:host="com.mj.app"
                    android:scheme="common"/>
            </intent-filter>
        </activity>
    </application>
  1. 在需要的跳转的页面添加注解,添加路由路劲
@Route(path = ARouterConstant.TEST_ACTIVITY)
public class TestActivity extends BaseActivity {

}
  1. 使用ARouter跳转
    /**
     * 通过url跳转
     */
    private void aRouterJumpByUri(){
        String url = ARouterConstant.A_ROUTER_BASE_URL + ARouterConstant.TEST_ACTIVITY;
        Log.d("url","url = " + url);
        Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
        startActivity(intent);
    }
URL携带参数的跳转
  • 同上
     /**
     * 带参数的url跳转
     * 就是把数据拼接在url后面
     */
    private void aRouterJumpByUri(String name, int age) {
        String url = ARouterConstant.A_ROUTER_BASE_URL + ARouterConstant.TEST_ACTIVITY;
        url += "?name=" + name + "&age = " + age;
        Log.d("url", "url = " + url);
        Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
        startActivity(intent);
    }

  • 解析参数

@Route(path = ARouterConstant.TEST_ACTIVITY)
public class TestActivity extends BaseActivity {

    private static final String TAG = "TestActivityTAG";

    @Autowired(name = "name")
    private String name;

    @Autowired(name = "age")
    private int age;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ARouter.getInstance().inject(this);
        Log.d(TAG,"name = " + name);
        Log.d(TAG,"age = " + age);
    }
}

更多的下次继续,今天就到这里了。(2023-4-8)

相关文章

网友评论

      本文标题:Android基础之Arouter的使用

      本文链接:https://www.haomeiwen.com/subject/bahyddtx.html