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 원리 공식 문서
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JAVA- 소스 코드 분할(Package 사용)▪️test45.java 소스 코드 ▪️test47.java 소스 코드 ▪️실행 결과 더하면 12, 당기면 8 ▪️예① 클래스 이름에 대한 완전한 입력 생략 import 문 사용 ▪️예① test45.java 소스 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.