ARouter學習隨筆


今天看了會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,"我想說,我餓了");

說實話,我不是很明白這服務的作用,可能經驗尚淺,沒有碰到實際應用場景。但是隱約感覺到還是有用的,比如把一些功能寫成服務,在其他地方隨便調用。

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM