Arouter的使用

依賴
implementation 'com.alibaba:arouter-api:1.4.1'
annotationProcessor 'com.alibaba:arouter-compiler:1.2.2'
defaultConfig {
        javaCompileOptions {
            annotationProcessorOptions {
                arguments = [AROUTER_MODULE_NAME: project.getName()]
            }
        }

然后在Application里面進(jìn)行初始化。

if (BuildConfig.DEBUG){
            ARouter.openLog();
            ARouter.openDebug();
        }
        
ARouter.init(this);
不帶參跳轉(zhuǎn)
ARouter.getInstance()
        .build("/main/LogoutActivity")
        .navigation();
        
        
@Route(path = "/main/LogoutActivity")
public class LogoutActivity extends AppCompatActivity {
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_out);
    }
}
帶參跳轉(zhuǎn)
ARouter.getInstance()
        .build("/main/login")
        .withString("path","您好")
        .navigation();
        
        
@Route(path = "/main/login")
public class LoginActivity extends AppCompatActivity {
    
    /*@Autowired
    public String path;*/

    @Autowired(name = "path")
    public String pasts;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);
        Log.e("zzf","跳轉(zhuǎn)過來了");
        ARouter.getInstance().inject(this);
        TextView textView = findViewById(R.id.tv);
        textView.setText(pasts);
    }
}        

在這需要注意下面幾點(diǎn):

1、被@Autowired修飾的成員變量不能背pravite修飾,不然運(yùn)行時(shí)會(huì)報(bào)錯(cuò)

2、如果@Autowired沒有指定name,則成員變量的名字必須為傳過來的key,不然沒有效果

@Autowired
public String path

3、如果@Autowired指定name,則成員變量的名字可以隨便寫。

@Autowired(name = "path")
public String pasts;
uri跳轉(zhuǎn)
Uri uri = Uri.parse("test://com/main/UrlLoginActivity");
ARouter.getInstance().build(uri).navigation()
@Route(path = "/main/UrlLoginActivity")
public class UrlLoginActivity extends AppCompatActivity {
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_url);
    }
}
<activity android:name=".UrlLoginActivity">
            <intent-filter>
                <data android:host="com"
                    android:scheme="test"/>
                <action android:name="android.intent.action.VIEW"/>
                <category android:name="android.intent.category.DEFAULT"/>
                <category android:name="android.intent.category.BROWSABLE"/>
            </intent-filter>
        </activity>
startActivityForResult
ARouter.getInstance()
        .build("/main/ForResultActivity")
        .withInt("paths",1)
        .navigation(MainActivity.this,0);
        
@Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == 0){
            if (resultCode == 1){
                btn_ForResult.setText(data.getIntExtra("name",0)+"");
            }
        }
    }
@Route(path = "/main/ForResultActivity")
public class ForResultActivity extends AppCompatActivity {

    @Autowired
    public int paths;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_for_result);
        TextView textView = findViewById(R.id.tv);
        textView.setText(paths+"");
        textView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                setResult(1,new Intent().putExtra("name",666));
                finish();
            }
        });
    }
}
 很多博客都說requestCode必須>0
 其實(shí)看源碼0是可以的
 if (requestCode >= 0) {  // Need start for result
    if (currentContext instanceof Activity) {
            ActivityCompat.startActivityForResult((Activity) currentContext, intent, requestCode, postcard.getOptionsBundle());
    } else {
            logger.warning(Consts.TAG, "Must use [navigation(activity, ...)] to support [startActivityForResult]");
     }
  } else {
        ActivityCompat.startActivity(currentContext, intent, postcard.getOptionsBundle());
  }
                
跳轉(zhuǎn)攔截
@Interceptor(priority = 1)
public class TestInterceptor implements IInterceptor {
    @Override
    public void process(Postcard postcard, InterceptorCallback callback) {
        if (postcard.getPath().equals("/main/login")){
            ARouter.getInstance().build("/app/Mainactivity").navigation();
        }else {
            callback.onContinue(postcard);
        }
    }

    @Override
    public void init(Context context) {

    }
}
降級策略
Uri uri = Uri.parse("test://com/main/UrlLoginActivity");
                ARouter.getInstance().build(uri).navigation(MainActivity.this, new NavigationCallback() {
                    @Override
                    public void onFound(Postcard postcard) {

                    }

                    @Override
                    public void onLost(Postcard postcard) {
                        /**
                         * 在這做降級處理,傳遞的path有問題時(shí),我們就可以跳轉(zhuǎn)到其他地方
                         */
                    }

                    @Override
                    public void onArrival(Postcard postcard) {
                        /**
                         * 跳轉(zhuǎn)成功的回調(diào)
                         */
                    }

                    @Override
                    public void onInterrupt(Postcard postcard) {

                    }
                });
            }

具體代碼看 https://github.com/fengyuehan/Test/tree/master/app

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容