Android 页面跳转 PageRouter

项目 demo 地址 用apt 实现欢迎 star issues

注解 @Route @Args
不用关心所跳转页面所需参数,BundleBuilder 会根据 @Args 获取变量名并自动生成 set 方法,输入 Test1ActivityBundle.Builder(). 后会提示出页面参数,省了撸代码找参数的时间

调用
PageRouter
          .of(this)
          .path(Constants.RouterPath.TEST2)
          .navigation();
PageRouter
          .of(this)
          .path(Constants.RouterPath.TEST1)
          .setParams(new Test1ActivityBundle.Builder()
                            .setName('z')
                            .setMoney(50000)
                            .setBeanS(new SerializableBean("SerializableBean"))
                            .setBeanP(new ParcelableBean("ParcelableBean"))
                            .setStringArrayList(as)
                            .setIntegerArrayList(ai)
                            .setBm(bm)
                            .setMsg("Welcome2Test1Activity")
                            .bundle())
          .setUri(Uri.parse(""))
          .navigation();
注解及其使用
@Route(path = Constants.RouterPath.TEST1)
public class Test1Activity extends AppCompatActivity {
    @Args
    public String msg;
    @Args
    public Character name;
    @Args
    public double money;
    @Args
    public SerializableBean beanS;
    @Args
    public ParcelableBean beanP;
    @Args
    public Bitmap bm;
    @Args
    public ArrayList stringArrayList;
    @Args
    public ArrayList integerArrayList;
...
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test_1);
        // 引入
        BundleService.bind(this);

demo gif :


router.gif

原理:(都在生成的文件下)
也就是大家熟悉的 apt 技术了
生产的代码 segment 如下
RouterDispatcher.java :
naviagtion() 方法 会调用 go() 方法

public static void go(Context ctx,String path,Bundle extras, Uri uri){ 
        if(ctx==null)return;
        Intent intent = null;
        switch (path){
            case "Test2Activity":
               intent = new Intent(ctx, Test2Activity.class);
            break;
            case "Test1Activity":
               intent = new Intent(ctx, Test1Activity.class);
            break;

        }
        if (intent == null) return;
        if (extras != null) {
            intent.putExtras(extras);
        }
        if (!(ctx instanceof Activity)) {
            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        }
        if (uri != null){
            intent.setData(uri);
        }
        ctx.startActivity(intent);

    }

Test1ActivityBundle.java
BundleService.bind 会调用 bind 方法

... 省略部分代码
public Test1ActivityBundle.Builder setMsg(java.lang.String msg){
    args.putString("msg",msg);
    return this;
}
public Test1ActivityBundle.Builder setName(java.lang.Character name){
    args.putChar("name",name);
    return this;
}
... 省略部分代码
public static void bind(Test1Activity target) {
        Intent intent = target.getIntent();
        if (intent==null)return;
        Bundle source = intent.getExtras();
        if (source==null)return;
        if (source.containsKey("msg")) {
            target.msg = (java.lang.String) source.getString("msg");
        } else {
            throw new IllegalStateException("msg is required, but not found in the bundle.");
        }
        if (source.containsKey("name")) {
            target.name = (java.lang.Character) source.getChar("name");
        } else {
            throw new IllegalStateException("name is required, but not found in the bundle.");
        }
... 省略部分代码

你可能感兴趣的:(Android 页面跳转 PageRouter)