Android Apt 의 Activity Route 예제
Apt 가 뭐야?
APT 는 원리 적 으로 컴 파일 기간 의 주석 처리 도구(Annotation Processing Tool)이다.일부 주류 의 3 자 라 이브 러 리(ButterKnife,Glide)는 모두 이 기술 을 사용 하여 코드 를 생 성 했다.
Apt 는 무슨 좋 은 점 이 있 습 니까?
4.567917.템 플 릿 코드 를 자동 으로 생 성하 여 개발 효율 을 높 였 다.
4.567917.컴 파일 기간 에 주 해 를 처리 하 는 것 은 운행 기간 에 주 해 를 처리 하 는 것 보다 성능 이 훨씬 좋다Gradle 스 크 립 트 의 apt 와 annotationProcessor
이 두 가 지 는 넓 은 의미 에서 말 하면 모두 컴 파일 기간 의 주해 처리 도구 이다.안 드 로 이 드-apt(사실은 gradle 플러그 인 입 니 다.apt 는 플러그 인 명령 입 니 다)는 초기 github 의 오픈 소스 프로젝트 입 니 다.annotationProcessor 는 gradle build tools 2.2 이후 자체 적 으로 가 져 온 컴 파일 기 주석 도구 입 니 다.안 드 로 이 드-apt 의 작성 자 는 안 드 로 이 드 스튜디오 플러그 인 이 annotationProcessor 를 지원 하고 안 드 로 이 드-apt 사용 을 경고 하고 막 을 것 이 라 고 성명 을 발표 했다.전체적으로 말 하면,당신 의 gradle build tools 버 전 을 보면,낮은 버 전 은 android-apt(플러그 인 도입 필요),높 은 버 전 은 annotationProcessor(플러그 인 도입 필요 없 음)
코드 디자인
수요 분석
route 모듈 을 세 부분 으로 나 눕 니 다(안 드 로 이 드 library 하나,자바 library 두 개)
1、router-annotation(java library)
여기 자바 프로젝트 에 주석 만 넣 은 성명 류 입 니 다.이곳 에 서 는 두 개의 주해 인 RouterActivity,RouterField 만 실현 했다.
2、router-compiler (java library)
이 프로젝트 는 컴 파일 기간 에 의존 하 는 프로젝트 로 컴 파일 기간 스 캔 코드 로 RouterActivity,RouterField 라 는 두 주석 에 따라 관련 코드 를 생 성 하 는 역할 을 합 니 다.코드 를 스 캔 하고 코드 를 만 드 는 방법 을 알려 드 려 야 합 니 다.이 기능 의 구현 은 주로 두 개의 라 이브 러 리 에 의존 합 니 다.Google 의 auto-service(스 캔 코드),Squareup 의 javapoet(코드 생 성)
3、router (android library)
주요 논리 코드.이 모듈 에 서 는 일부 기능 류 와 인 터 페 이 스 를 정의 할 것 이다.router-copiler 모듈 은 이러한 인터페이스 와 기능 류 generate 논리 코드 에 따라 사용 할 수 있 습 니 다.주의해 야 할 것 은 router-copiler 는 router 에 의존 할 필요 가 없습니다.router-copiler 는 가방 이름+클래스 이름 에 따라 클래스 를 가 져 옵 니 다.
코드 구현
router-annotation
RouterActivity 는 주석 입 니 다.이 주석 으로 수 정 된 Activity 는 지정 한 경로 주소 에 따라 경로 표 에 자동 으로 추 가 됩 니 다.시스템 이 경로 표를 마 운 트 한 후에 지정 한 경로 주소 에 따라 특정한 Activity 에 접근 할 수 있 습 니 다.코드 는 다음 과 같 습 니 다:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface RouterActivity {
String[] value();
}
여기 Activity 는 여러 경로 로 주 소 를 수정 할 수 있 습 니 다.RouterField 는 Activity 가 전환 할 때 매개 변수 가 전달 하 는 것 을 나타 내 는 주해 로 이 주해 로 수식 하 는 구성원 변 수 는 Intent 인 자 를 받 는 변 수 를 나타 낸다.
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface RouterField {
String[] value();
}
router-compiler이 모듈 은 하나의 라 우 터 프로세서 만 포함 되 어 있 으 며,이러한 종류의 대체적인 구 조 는 다음 과 같다.
// AutoService ,
@AutoService(Processor.class)
public class RouterProcessor extends AbstractProcessor{
private Elements elementUtils;
private String targetModuleName = "";
@Override
public Set<String> getSupportedAnnotationTypes() {
//
return Collections.singleton(RouterActivity.class.getCanonicalName());
}
@Override
public boolean process(Set<? extends TypeElement> set, RoundEnvironment roundEnvironment) {
//
...
return true;
}
@Override
public synchronized void init(ProcessingEnvironment processingEnvironment) {
super.init(processingEnvironment);
// build.gradle
}
@Override
public SourceVersion getSupportedSourceVersion() {
// Jdk
return SourceVersion.RELEASE_7;
}
}
다음은 함수 의 실현 에 대해 설명 하 겠 습 니 다.1.init 함수
우리 의 프로젝트 는 대부분 다 중 module 형식 입 니 다.이 럴 때 우 리 는 모든 module 에 Activity 경로 등록 표를 만 든 다음 에 응용 프로그램 이 초기 화 될 때 모든 경로 등록 표를 마 운 트 하여 Activity 경로 전환 의 목적 을 달성 해 야 합 니 다.init 함수 에서 각 모듈 경로 표 의 접두사 이름 을 설정 합 니 다.
@Override
public synchronized void init(ProcessingEnvironment processingEnvironment) {
super.init(processingEnvironment);
elementUtils = processingEnvironment.getElementUtils();
Map<String, String> map = processingEnvironment.getOptions();
Set<String> keys = map.keySet();
for (String key: keys) {
if ("targetModuleName".equals(key)) {
this.targetModuleName = map.get(key);
}
System.out.println(key + " + " + map.get(key));
모듈 의 build.gradle 파일 에 다음 코드 를 설정 합 니 다:
apt {
arguments {
targetModuleName 'moduleName'
}
}
2.프로 세 스 함수이 함수 의 대략적인 절 차 는 다음 과 같다.RouterActivity 에 의 해 수 정 된 모든 Activity 를 찾 습 니 다.router 모듈 의 Router Initializer 인 터 페 이 스 를 실현 하고 모든 Activity 의 경로 주 소 를 경로 표 에 추가 합 니 다.또한 모든 Activity 에 XXXActivity Helper(보다 우호 적 인 Activity 조정 에 사용)를 만 들 고 모든 XXXAcitivyHelper 를 RouterHelper 에 넣 어 get 방법 을 제공 합 니 다.process 함수 의 구체 적 인 실현 은 프로젝트 소스 코드 를 상세 하 게 볼 수 있 습 니 다.
router
RouterInitializer 인 터 페 이 스 는 각 module 레 지 스 트 의 실현 에 사 용 됩 니 다
라 우 터 초기 화
public class DemoApp extends Application {
@Override
public void onCreate() {
super.onCreate();
Router.init("demo"); // scheme
}
}
액 티 비 티 점프
@RouterActivity({"main"})
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.btn_second).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
RouterHelper.getSecondActivityHelper().start(MainActivity.this);
}
});
}
}
@RouterActivity({"second"})
public class SecondActivity extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
}
}
build 디 렉 터 리 에서 생 성 된 코드 는 다음 과 같 습 니 다.상세 코드 는 볼 수 있 습 니 다Github 프로젝트
현 단계 코드 가 완선 되 지 않 아 후기 에 더 많은 기능 을 추가 할 것 이다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Bitrise에서 배포 어플리케이션 설정 테스트하기이 글은 Bitrise 광고 달력의 23일째 글입니다. 자체 또는 당사 등에서 Bitrise 구축 서비스를 사용합니다. 그나저나 며칠 전 Bitrise User Group Meetup #3에서 아래 슬라이드를 발표했...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.