Android基础之Arouter的使用

2023-04-05  本文已影响0人  南风知我咦

资料

组件化开发的利器

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

简单使用

配置

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

简单使用

/**
 * 路由表
 */
public class ARouterConstant {
    public static final String USB_ACTIVITY = "/com/mj/UsbActivity";
}

依赖注入
@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();
    }
混淆
-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插件导航

进阶用法

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)

上一篇 下一篇

猜你喜欢

热点阅读