Arouter學習筆記--使用

1、集成
參考官方文檔https://github.com/alibaba/ARouter
在module的build.gradle中添加對應引用,注意版本對齊

defaultConfig {
       ......
        javaCompileOptions {
            annotationProcessorOptions {
                arguments = [AROUTER_MODULE_NAME: project.getName()]
            }
        }
    }
dependencies {
   .....
    implementation 'com.alibaba:arouter-api:1.5.0'
    annotationProcessor 'com.alibaba:arouter-compiler:1.2.2'

}

2、使用
在Application裏初始化

 ARouter.init(this);

在對應的頁面使用註解標記頁面路由路徑,有嚴格的規則,以 /…/… 格式 例如

@Route(path = "/module1/mainActivity")
public class Module1_MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.module1_main_activity);
    }
}

標記之後編譯項目 會在build文件中生成對應標記類
在這裏插入圖片描述
在想跳轉的地方調用跳轉api

 ARouter.getInstance().build("/module1/mainActivity").navigation();

傳參數和接收參數,所有基礎類型和序列化的都可以,不滿足的也可用bundle

ARouter.getInstance().build("/module1/mainActivity").withString("key","參數").navigation();

接收參數 使用註解和注入

@Route(path = "/module1/mainActivity")
public class Module1_MainActivity extends AppCompatActivity {

    @Autowired
    String key;


    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.module1_main_activity);
        ARouter.getInstance().inject(this);
        Log.d("Module1_MainActivity", key);
    }
}

簡單的跳轉和參數傳遞基本可以滿足日常需求,達到模塊化的解耦,沒有模塊直接依賴,必然在引用方面是比較麻煩的,如找目標類,維護路由表

3、高級用法 模塊之間通信
除了界面跳轉之外,Arouter還能跨模塊調用其他模塊實現的方法
1 、在基礎模塊定義接口 繼承 IProvider

public interface TestServer extends IProvider {
      void callServer();
}

其他模塊依賴基礎模塊,實現服務,並設置好對應路由路徑
例如 模塊1

@Route(path = "/module1/server")
public class Module1Server implements TestServer {
    @Override
    public void init(Context context) {

    }

    @Override
    public void callServer() {
        Log.d("Module1Server", "模塊1的服務");
    }
}

模塊2

@Route(path = "/module2/server")
public class Module2Server implements TestServer {
    @Override
    public void callServer() {
      Log.d("Module2Server", "模塊2的服務");
    }

    @Override
    public void init(Context context) {

    }
}

此時模塊1和模塊2沒有依賴關係 通過控制反轉 ioc 注入 初始化對象實例
如模塊1調用模塊2方法

@Route(path = "/module1/mainActivity")
public class Module1_MainActivity extends AppCompatActivity {

    @Autowired(name = "/module2/server")
    TestServer testServer;


    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.module1_main_activity);
        ARouter.getInstance().inject(this);
        
        testServer.callServer();
    }
}

通過註解的路由路徑找到要實例化的類

@Autowired(name = "/module2/server")
    TestServer testServer;

通過注入 初始化

ARouter.getInstance().inject(this);

即可把testServer 實例化成 Module2Server 對象了

4、攔截器
聲明攔截器,這裏是註解實現的,是全局的攔截器。例如:登陸問題

@Interceptor(priority = 2)
public class MyInterceptor implements IInterceptor {
    @Override
    public void process(Postcard postcard, InterceptorCallback callback) {
      Log.d("MyInterceptor", "攔截器");
      callback.onContinue(postcard);
    }

    @Override
    public void init(Context context) {

    }
}

5、降級服務
統一處理跳轉失敗的情況 path 隨便寫

/**
 * 降級服務  path  任意
 * */
@Route(path = "/aaa/aaa")
public class DegradeServiceImpl implements DegradeService {
    @Override
    public void onLost(Context context, Postcard postcard) {
        Log.d("DegradeServiceImpl", "postcard:" + postcard);
    }

    @Override
    public void init(Context context) {

    }
}

日常使用 足夠了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章