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 레 지 스 트 의 실현 에 사 용 됩 니 다
  • Activity Helper 는 일부 매개 변수 해석 논 리 를 밀봉 하여 더욱 편리 한 Activity 점프
  • SafeBundle 은 Activity 의 매개 변 수 를 봉인 했다
  • Router,루트 핵심 클래스,url 점프 지원,url 해석,그리고 점프 실현
  • 'RouterCenter Activity',외부 브 라 우 저 에 의 해 불 러 올 수 있 는 중계 Activity(외부 url scheme 에 따라 RouterCenter Activity,RouterCenter Activity 배포 경로 주소)
  • 코드 사용
    라 우 터 초기 화
    
    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 프로젝트
    현 단계 코드 가 완선 되 지 않 아 후기 에 더 많은 기능 을 추가 할 것 이다.
    이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

    좋은 웹페이지 즐겨찾기