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) {
}
}
日常使用 足夠了