項目 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<String> stringArrayList;
@Args
public ArrayList<Integer> integerArrayList;
...
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test_1);
// 引入
BundleService.bind(this);
demo 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.");
}
... 省略部分代碼