arouter 액 티 비 티 점프 원리 실현

사고 분석
arouter 는 구성 요소 간 페이지 전환 을 매우 간단하게 실현 할 수 있 습 니 다. 실현 하 는 기본 적 인 사 고 는?   
1. 대응 하 는 activity 에 주 해 를 추가 하고 apt 기술 을 통 해 코드 를 자동 으로 생 성 합 니 다. 코드 는 activity 대응 경로 와 class 를 경로 표 에 추가 할 수 있 습 니 다.
2. 스 캔 을 통 해 모든 종 류 를 얻 고 자동 실행 절차 1 에서 생 성 된 코드 를 옮 겨 다 니 며 경로 표 에 해당 하 는 데이터 가 있 습 니 다. 경로 표 의 데이터 구 조 는 Map > routes 입 니 다.
3. 점프 를 할 때 경 로 를 통 해 경로 표 에서 해당 하 는 acitivity 를 찾 아 점프 를 실현 할 수 있다.
2. 소스 코드 분석
1. 주해
주해 컴 파일 에 서 는 사용자 정의 주해 @ Route 설정 경 로 를 이용 하여 RouteProcessor 의 process 방법 에서 코드 를 생 성 합 니 다. 코드 에 대응 하 는 경로, 목표 activity 를 경로 표 에 추가 할 수 있 습 니 다.
//Route.java      Route
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.CLASS)
public @interface Route {
    String path();
    String group() default "";
    String name() default "";
   int extras() default Integer.MIN_VALUE;
   int priority() default -1;
}

//RouteProcessor.java      
public class RouteProcessor extends AbstractProcessor {
    public boolean process(Set extends TypeElement> annotations, RoundEnvironment roundEnv) {
        if (CollectionUtils.isNotEmpty(annotations)) {
            //   Route       
            Set extends Element> routeElements = roundEnv.getElementsAnnotatedWith(Route.class);
            try {
                logger.info(">>> Found routes, start... << routeElements) throws IOException {
        ...
                    //       
                    loadIntoMethodOfGroupBuilder.addStatement(
                            "atlas.put($S, $T.build($T." + routeMeta.getType() + ", $T.class, $S, $S, " + (StringUtils.isEmpty(mapBody) ? null : ("new java.util.HashMap(){{" + mapBodyBuilder.toString() + "}}")) + ", " + routeMeta.getPriority() + ", " + routeMeta.getExtra() + "))",
                            routeMeta.getPath(),
                            routeMetaCn,
                            routeTypeCn,
                            className,
                            routeMeta.getPath().toLowerCase(),
                            routeMeta.getGroup().toLowerCase());

                    routeDoc.setClassName(className.toString());
                    routeDocList.add(routeDoc);
                }

                // Generate groups
                String groupFileName = NAME_OF_GROUP + groupName;
                JavaFile.builder(PACKAGE_OF_GENERATE_FILE,
                        TypeSpec.classBuilder(groupFileName)
                                .addJavadoc(WARNING_TIPS)
                                .addSuperinterface(ClassName.get(type_IRouteGroup))
                                .addModifiers(PUBLIC)
                                .addMethod(loadIntoMethodOfGroupBuilder.build())
                                .build()
                ).build().writeTo(mFiler);

                logger.info(">>> Generated group: " + groupName + "<<

위 는 컴 파일 기간 에 경로 표를 생 성 하 는 것 을 실 현 했 습 니 다. 생 성 된 경로 표 는 app / build / intermediates / classes / 패키지 이름 / routes 에서 자동 으로 생 성 된 코드 는 다음 과 같 습 니 다.
 
public class ARouter$$Group$$test implements IRouteGroup {
    atlas.put("/test/activity2", RouteMeta.build(RouteType.ACTIVITY, Test2Activity.class, "/test/activity2", "test", new HashMap() {
            {
                this.put("key1", 8);
            }
        }, -1, -2147483648));
        atlas.put("/test/activity3", RouteMeta.build(RouteType.ACTIVITY, Test3Activity.class, "/test/activity3", "test", new HashMap() {
            {
                this.put("name", 8);
                this.put("boy", 0);
                this.put("age", 3);
            }
        }, -1, -2147483648));
}

2. 모든 종 류 를 스 캔 해서 가 져 오기
단계 1 에서 생 성 된 코드 는 자동 으로 실행 되 지 않 기 때문에 스 캔 을 통 해 모든 class 를 가 져 오고 루트 테이블 에 추가 하 는 방법 을 반복 해서 실행 해 야 합 니 다
//LogisticsCenter.java
public synchronized static void init(Context context, ThreadPoolExecutor tpe){
    //              class
    routerMap = ClassUtils.getFileNameByPackageName(mContext, ROUTE_ROOT_PAKCAGE);
    for (String className : routerMap) {
        //           
        ((IRouteRoot) (Class.forName(className).getConstructor().newInstance())).loadInto(Warehouse.groupsIndex);
    }
}

3. 점프
경로 표 가 있 으 면 점프 할 때 목표 activity 경 로 를 통 해 arouter 는 경로 에 따라 경로 표 에서 목표 activity 를 찾 은 다음 에 목표 activity 를 intent 에 설정 한 다음 에 startActivity 를 통 해 점프 를 실현 합 니 다. 
//_ARouter.java
private Object _navigation(final Context context, final Postcard postcard, final int requestCode, final NavigationCallback callback) {
        final Context currentContext = null == context ? mContext : context;

        switch (postcard.getType()) {
            case ACTIVITY:
                //   intent,    activity,postcard.getDestination()  XxxActivity.class
                final Intent intent = new Intent(currentContext, postcard.getDestination());
                intent.putExtras(postcard.getExtras());

                //   flag
                int flags = postcard.getFlags();
                if (-1 != flags) {
                    intent.setFlags(flags);
                } else if (!(currentContext instanceof Activity)) {    // Non activity, need less one flag.
                    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                }

                // Set Actions
                String action = postcard.getAction();
                if (!TextUtils.isEmpty(action)) {
                    intent.setAction(action);
                }

                //            
                runInMainThread(new Runnable() {
                    @Override
                    public void run() {
                        //  startActivity     
                        startActivity(requestCode, currentContext, intent, postcard, callback);
                    }
                });

                break;
            ...
        }

        return null;
    }

    Postcard 클래스 에는 @ Route 주해 설정 을 이용 한 경로, 매개 변수 휴대, action, 대상 activity (즉 destination) 등 이 포함 되 어 있 으 며, postcard 의 매개 변 수 를 intent 에 설정 한 후 startActivity 를 통 해 점프 합 니 다.
더 알 고 싶 으 시 면 클릭 하 세 요.
자바 주해 컴 파일 학습
arouter 원리 공식 문서

좋은 웹페이지 즐겨찾기