今天看了會ARouter,在這里簡單記錄下
跟着其他大哥的博客學習了下,總感覺不牢固,借此機會再次簡單記錄下。
第一步:ARouter 配置
android { defaultConfig { ... javaCompileOptions { annotationProcessorOptions { arguments = [ moduleName : project.getName() ] } } } } dependencies { /* ARouter */ compile 'com.alibaba:arouter-api:1.2.2' annotationProcessor 'com.alibaba:arouter-compiler:1.1.3' }
第二步:ARouter 初始化
public class DemoApplication extends Application{ @Override public void onCreate() { super.onCreate(); ARouter.openLog(); // 打印日志 ARouter.openDebug(); // 開啟調試模式,線上版本需要關閉,否則有安全風險) ARouter.init( this ); // 盡可能早,推薦在Application中初始化 } }
目前准備工作就緒,通常如果從A頁面跳轉到B頁面,下面代碼我們都很熟悉。
Intent intent = new Intent(A.this,B.class); startActivity(intent);
但是用ARouter就厲害了,注意了,注意了哈。
第三步:新建兩個Activity
MainActivity和SecondActivity,從MainActivity路由到SecondActivity,SecondActivity代碼如下:
@Route(path = "/activity/secondActivity") public class SecondActivity extends AppCompatActivity{ @Autowired String name; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_second); ARouter.getInstance().inject(this); Toast.makeText(this,name,Toast.LENGTH_SHORT).show(); } }
對於被路由到的Activity需要用Route注解,並且注明path路徑,path路徑需要有兩層及以上,比如"/activity/secondActivity",在此個人建議可以對所有的path路徑封裝在類或接口中,便於統一管理。
public interface RouterContacts { String GRO_LOGIN = "/login/"; interface login { String LOGIN = GRO_LOGIN + "login"; } String GRO_MAIN = "/main/"; interface main { String MAIN = GRO_MAIN + "main"; } }
按類別來分,美觀大方。
然后在MainActivity中來出發路由,如下
ARouter.getInstance().build("/activity/secondActivity").navigation();
好了,走到這里,基本的路由已經完成了。
這就完了?只是跳轉並不能滿足我們,我們還要路由帶參數
我們先看下在發起者(此處是MainActivity)那里如何用
ARouter.getInstance(). build("/activity/secondActivity"). withString("name","小菜鳥"). navigation();
是的,就是這么簡單,另外,ARouter提供了豐富的傳參類型,必須多方位滿足你。
看看,是不是很多,隨便用吧!!
如何取值呢?上邊SecondActivity的代碼綠色部分已經體現出如何接收取值了。大致為:
a.為參數聲明字段,並用@Autowired注解表示,
b.使用ARouter.getInstance().inject(this);方法來inject來初始化@Autowired注解的字段。
c.拿到值了,用就行。
路由結果:
有些時候我們要知道路由結果,比如是否到達,是否丟失,是否被攔截,貼心的ARouter也幫我們想到了
ARouter.getInstance().build("/activity/secondActivity").withString("name","王二蛋").navigation(this, new NavCallback() { @Override public void onArrival(Postcard postcard) { Toast.makeText(MainActivity.this,"已經跳到secondActivity",Toast.LENGTH_SHORT).show(); } });
源碼是這樣的
public abstract class NavCallback implements NavigationCallback { @Override public void onFound(Postcard postcard) { // Do nothing } @Override public void onLost(Postcard postcard) { // Do nothing } @Override public abstract void onArrival(Postcard postcard); @Override public void onInterrupt(Postcard postcard) { // Do nothing } }
實際用的時候重寫用到的方法就行,我目前用onArrival(Postcard postcard);最多,比如在路由到主頁面后關閉登錄界面等。
ARouter管理服務之暴露服務
聲明一個接口
public interface IService extends IProvider { void saySomething(Context context,String someword); }
實現接口
@Route(path = "/service/testsaySomething") public class MySerivce implements IService{ @Override public void saySomething(Context context,String someword) { Toast.makeText(context ,"hello", Toast.LENGTH_SHORT).show(); } @Override public void init(Context context) { } }
ARouter管理服務之發現服務
可以通過兩種API來獲取Service,分別是ByName、ByType
IService service = ARouter.getInstance().navigation(IService.class); IService service = (IService) ARouter.getInstance().build("/service/testsaySomething").navigation(); service.saySomething("我想說我餓了");
還可以這樣的,在需要調用的class中聲明,如同聲明變量。
@Autowired(name = "/service/testsaySomething")
IService service;
然后初始化@Autowired
ARouter.getInstance().inject(this);
然后調用就ok了
service.saySomething(this,"我想說,我餓了");
說實話,我不是很明白這服務的作用,可能經驗尚淺,沒有碰到實際應用場景。但是隱約感覺到還是有用的,比如把一些功能寫成服務,在其他地方隨便調用。