1、ARouter是什麼?
ARouter是阿里開源的一款android路由框架。按照git上的原說法:他是一個用於幫助 Android App 進行組件化改造的框架 —— 支持模塊間的路由、通信、解耦。
2、ARouter有什麼作用?
解耦、方便管理多頁面的動態跳轉,提供組件化解耦的一種方案,同一Native與H5的跳轉方法。
3、爲什麼要用ARouter?
動態跳轉:針對複雜邏輯下,多個頁面進行跳轉。
組件化:針對組件化,隨着業務量的不斷增長,app也會不斷的膨脹,app一般都會走向組件化。組件化就是將APP按照一定的功能和業務拆分成多個組件module,不同的組件獨立開發,組件化不僅能夠提供團隊的工作效率,還能夠提高應用性能。而組件化的前提就是解耦,那麼我們首先要做的就是解耦頁面之間的依賴關係。
Native與H5:因爲在H5中是無法使用StartActivity()跳轉到Native頁面的,而從Native跳轉到H5頁面也只能通過配置瀏覽器的方式實現。
4、與常規頁面跳轉的比較
顯式跳轉:
Intent intent = new Intent(activity, XXActivity.class);
由於需要直接持有對應class,從而導致了強依賴關係,提高了耦合度
隱式跳轉:
Intent intent = new Intent();
intent.setAction(“com.android.activity.MY_ACTION”);
其中action等屬性的定義在Manifest,導致了擴展性較差,規則集中式管理,導致協作變得非常困難。
5、ARouter的基礎使用
A、添加依賴和配置
android {
defaultConfig {
...
javaCompileOptions {
annotationProcessorOptions {
arguments = [ moduleName : project.getName() ]
}
}
}
}
dependencies {
// 替換成最新版本, 需要注意的是api
// 要與compiler匹配使用,均使用最新版可以保證兼容
implementation 'com.alibaba:arouter-api:1.3.1'
annotationProcessor 'com.alibaba:arouter-compiler:1.1.4'
}
// 舊版本gradle插件(< 2.2),可以使用apt插件,配置方法見文末'其他#4'
// Kotlin配置參考文末'其他#5'
注意:這裏有個坑
git官方用的是下面的,然後當你運行的時候,會拋出ARouter::Compiler >>> No module name, for more information, look at gradle log. 的錯誤,我對官網留下的坑和其他哥們兒不負責的轉載表示絕望……至少我這裏是拋出這個錯的。所以在按照官方配置時遇到這個報錯時,將arguments的參數改成上面的代碼arguments = [ moduleName : project.getName() ] 應該就能解決,其次如果使多model時,請在每個module裏面的build.gradle中進行配置。
android {
defaultConfig {
...
javaCompileOptions {
annotationProcessorOptions {
arguments = [AROUTER_MODULE_NAME: project.getName()]
}
}
}
}
B、添加註解
@Route(path = "/aroute/SecondActivity")
public class SecondActivity extends AppCompatActivity {
}
在支持路由的頁面上添加註解, 這裏的路徑需要注意的是至少需要有兩級,/xx/xx
C、初始化SDK
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
if (isDebug()) { // 這兩行必須寫在init之前,否則這些配置在init過程中將無效
ARouter.openLog(); // 打印日誌
ARouter.openDebug(); // 開啓調試模式(如果在InstantRun模式下運行,必須開啓調試模式!線上版本需要關閉,否則有安全風險)
}
ARouter.init(this); // 儘可能早,推薦在Application中初始化
}
/**僅作參考用,免得有小夥伴說找不到方法
*/
public boolean isDebug() {
return true;
}
}
D、發起路由操作
a、應用內簡單的跳轉(通過URL跳轉在'進階用法'中)
ARouter.getInstance().build("/aroute/SecondActivity").navigation();
如我從MainActivity跳轉到SecondActivity,我可以這樣去寫點擊MainActivity的button觸發to2()
@Route(path = "/aroute/MainActivity")
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void to2(View view) {
ARouter.getInstance().build("/aroute/SecondActivity").navigation();
}
}
好了,跳轉完成,很簡單的寫法,大家都去試一下吧。
b、跳轉並攜帶參數
public void to2(View view) {
// ARouter.getInstance().build("/aroute/SecondActivity").navigation();
ARouter.getInstance().build("/aroute/SecondActivity")
.withString("key1", "xiaoming")
.withInt("key2",18)
.withBoolean("key3",true )
.navigation();
}
參數的接收,給要注入的對應變量寫上註解@Autowired,並賦予對應的跳轉key,並執行ARouter.getInstance().inject(this);完成參數注入
@Route(path = "/aroute/SecondActivity")
public class SecondActivity extends AppCompatActivity {
@Autowired
public String key1;//第一種參數寫法,直接寫傳入過來的key
@Autowired(name = "key2")//第二種參數寫法,在註解的name裏傳入過來的key
public int age;//並對該值進行重命名
@Autowired(name = "key3")
public boolean isMan;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
ARouter.getInstance().inject(this);
Log.i("Tomes","key1="+key1);
Log.i("Tomes","key2="+age);
Log.i("Tomes","key3="+isMan);
}
}
這裏打出來的日誌爲:
E、添加混淆規則
這裏以基礎混淆proguard-rules.pro文件爲例,混淆配置文件里加入
-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,需添加下面規則,保護接口
-keep interface * implements com.alibaba.android.arouter.facade.template.IProvider
# 如果使用了 單類注入,即不定義接口實現 IProvider,需添加下面規則,保護實現
# -keep class * implements com.alibaba.android.arouter.facade.template.IProvider
ARouter git地址:https://github.com/alibaba/ARouter