一款簡易Android路框架
AndroidRouter:ofollow,noindex">https://github.com/JasmineBen/AndroidRouter
AndroidRouter是一款路由框架,用於實現個模組之間的Activity跳轉。本文基於註解、編譯時位元組碼修改等技術實現了一款路由,實現了一款可用於元件化開發的路由框架,通過如下方式定義路由:
@Route(authority="sampleAuthority",path="samplePath",desc="sampleDesc")
通過如下方式進行跳轉:
Router.getInstance().openScheme(activity,url,bundleData,requestCode)
跳轉的時候引數不再需要使用者自己通過Intent方式傳輸,直接寫在url中即可。
使用方式:
1、整合元件
dependencies { api 'com.conan.router:router-anno:1.0.1' annotationProcessor 'com.conan.router:router-compiler:1.0.1' api 'com.conan.router:router-lib:1.0.1' } router{ routerImpl='com.conan.router.samples.SampleRouter' }
2、定義target路由
@Route(authority = "app",path = "MainActivity2",desc = "MainActivity2") public class MainActivity2 extends AppCompatActivity { @Inject(name = "") String name; @Inject(name = "age") String age; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main2); InjectService.inject(this); TextView tv = findViewById(com.conan.router.samples.R.id.text); tv.setText(name+":"+age); findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Router.getInstance().openScheme(MainActivity2.this,"router://app/MainActivity3?name1=MainActivity3&age1=1800",null,-1); } }); } }
在定義路由時,通過@Route定義authority,path資訊,通過@Inject完成Intent中引數的注入,注意@inject定義的值必須在路由的scheme中;同一個module最好使用同一個authority,相同的authority不能使用相同的path;不同的module需要使用不同的authority。
3、註冊路由
public class MyApplication extends Application{ @Override public void onCreate() { super.onCreate(); Router.getInstance().addBaseRouterImpl("com.conan.router.AppRouter"); SamplesApplicationLike.getInstance().onCreate(); } }
4、路由跳轉
Router.getInstance().openScheme(MainActivity.this,"router://sample/SampleActivity?sampleName=sample&sampleAge=18",null,-1);
AndroidRouter的使用分為4步:整合元件、定義路由、註冊路由、路由跳轉(簡單吧)。
注意:第1步的routerImpl和第3步的addBaseRouterImpl定義的路由實現類需要是一致的。
元件化支援
為了支援元件化,子module中需要除了以上4步之外,還需要提供一個入口類,用於註冊子模組的路由,如下所示:
public class SamplesApplicationLike { private static SamplesApplicationLike mInstance = new SamplesApplicationLike(); private SamplesApplicationLike(){} public static SamplesApplicationLike getInstance(){ return mInstance; } public void onCreate(){ Router.getInstance().addBaseRouterImpl("com.conan.router.samples.SampleRouter"); } }
在app的Application中需要呼叫子模組的註冊路由方法,這樣主模組就能訪問到子模組的路由資訊,子模組也可以訪問到主模組的路由。
總結
AndroidModule比較小巧,使用簡單,且可以應用於元件化開發。