Kotlin 으로 Router 의 예제 코드 를 만 듭 니 다.

5445 단어 KotlinRouter
0.
최근 에 이전의 프로젝트 를 받 았 는데,이전의 코드 가 비교적 난잡 하여 재 구성 을 준비 하고 있다.전체 프로젝트 의 기능 이 비교적 뚜렷 하고 제품 이 그 에 게 비교적 성숙 하고 강 한 app 으로 만들어 주 려 면 구성 요소 화 개발 이 필수 적 이다.모듈 개발 은 경로 가 선행 되 는 것 으로 알려 져 있다.Kotlin 을 사용 한 후부 터 자바 의 번 거 로 운 문법 과 쉴 새 없 이 지 껄 이 는 빈 지침 판단 이 징 그 러 워 서 Kotlin 으로 Router 를 쓰기 로 결정 했다.
1.
프로젝트 주소
코드,잘 생각 하고 다시 쓰 세 요.먼저 왜 모듈 화 개발 이 필요 한 지,왜 경로 와 이 경로 에 어떤 기능 이 필요 한 지 분석 해 보 세 요.
1.1
왜 모듈 화 개발 을 사용 합 니까?프로젝트 가 점점 커지 면서 모든 기능 을 하나의 모듈 에 넣 으 면 개발 과 테스트 에 있어 효율 적 인 문제 가 있 습 니 다.개발 에 있어 각종 업무 코드 가 혼합 되 어 문제 가 발생 하여 포 지 셔 닝 이 좋 지 않 습 니 다.테스트 에 있어 매번 수정 할 때마다 전체 프로젝트 테스트 를 다시 컴 파일 해 야 합 니 다.구성 요소 화 개발 을 이용 하여 업무 모듈 을 하나의 모듈 로 나 누 어 서로 독립 시 키 면 포 지 셔 닝 문제 도 쉽게 할 수 있 고 테스트 인원 들 이 테스트 하기 도 편리 합 니 다.해당 모듈 만 테스트 하면 되 기 때 문 입 니 다.그래서 저희 프로젝트 구 조 는 이 렇 을 거 예요.

1.2
왜 경로 사용:위 에서 말 했 듯 이 모든 module 은 서로 독립 된 것 이 고 activity 의 도약 을 실현 하려 면 서로 인용 해 야 합 니 다.이것 은 우리 가 보고 싶 지 않 은 것 입 니 다.모듈 간 에 의존 하지 않 아야 합 니 다.그러면 어떻게 서로 다른 모듈 의 도약 을 실현 합 니까?경로 가 필요 해.
1.3
이 길 은 어떤 기능 이 필요 합 니까?현재 필요 한 것 은 url 에 따라 서로 다른 모듈 간 의 Activity 도약 을 실현 하 는 것 입 니 다.전달 매개 변 수 를 포함 하여 startActivity 와 startActivity ForResult 와 유사 하여 서로 다른 모듈 의 fragment 를 얻 는 것 입 니 다.
2.
수요 가 다 생각 났 으 니 어떻게 실현 해 야 할 지 생각해 보 자.activity 전환 은 두 가지 가 있 습 니 다.암시 적 호출 과 디 스 플레이 호출 이 있 습 니 다.암시 적 호출 을 사용 하면 모든 activity 에 intent-filter 를 등록 해 야 합 니 다.귀 찮 으 면 호출 만 표시 할 수 있 습 니 다.그러나 디 스 플레이 호출 은 class 대상 이 필요 합 니 다.서로 다른 module 는 class 대상 을 얻 을 수 없습니다.어떻게 합 니까?컴 파일 하기 전에 얻 을 수 없습니다.실행 할 때 총 줄 이 필요 합 니 다.그래서 우 리 는 서로 다른 moudle 의 class 대상 을 저장 하고 하나의 값 으로 구분 할 수 있 는 용기 가 필요 합 니 다.그래서 우 리 는 map 가 필요 합 니 다.값 은 각 activity 와 fragment 의 url 을 구분 하 는 것 입 니 다.
두 번 째 문제 가 왔 습 니 다.url 은 어떻게 확정 합 니까?class 대상 은 어떻게 얻 고 맵 에 어떻게 넣 습 니까?여기 서 우 리 는 주 해 를 사용 합 니 다.우 리 는 주해 에서 url 을 설명 하 는 동시에 Processor 를 사용자 정의 하여 컴 파일 할 때 자바 파일 을 생 성 합 니 다.그 안에 한 가지 방법 만 있 습 니 다.

public void putRouteClass(ArrayMap<String, Class<?>> routableMap) {
routableMap.put("test", MainActivity.class);
}
각 module 에 주 해 를 추가 한 Activity 와 fragment 의 class 대상 에 따라 들 어 오 는 map 에 넣 습 니 다.이후 애플 리 케 이 션 의 onCreate 방법 에서 Router 의 register 방법 을 호출 합 니 다.

fun register(vararg moduleNames: String)
  {
    for (moduleName in moduleNames)
    {
      try
      {
        val cla = Class.forName(Constants.PACKAGE_NAME + Constants.DOT + moduleName + "_" + Constants.ROUTER_TABLE_IMP)

        val routerTable = cla.newInstance() as RouterTable

        routerTable.putRouteClass(classMap)
      } catch (e: ClassNotFoundException)
      {
        e.printStackTrace()
      } catch (e: Exception)
      {
        e.printStackTrace()
      }
    }

  }

이 방법 은 매우 간단 합 니 다.각 모듈 에서 Processor 를 이용 하여 생 성 된 대상 의 putRouteClass 방법 을 호출 하여 Router 의 전체 맵 을 전송 합 니 다.그러면 이 맵 은 주 해 를 추가 한 Activity 와 fragment 의 url 과 대응 하 는 class 대상 을 가지 고 있 습 니 다.클 라 스 대상 이 생기 면 하고 싶 은 대로 해 요.

//  startActivity
fun go(context: Context, url: String, extras: Bundle? = null)
  {
    val intent = Intent(context, classMap[url])

    if (extras != null)
    {
      intent.putExtras(extras)
    }

    context.startActivity(intent)
  }

  fun go(fragment: Fragment,url: String, extras: Bundle? = null)
  {
    val context=fragment.context
    if(context!=null)
    {
      go(context, url, extras)
    }
  }
  //  startActivityForResult
  fun goForResult(context: Context, url: String, requestCode: Int, extras: Bundle? = null)
  {
    val intent = Intent(context, classMap[url])

    if (extras != null)
    {
      intent.putExtras(extras)
    }

    if (context is Activity)
    {
      context.startActivityForResult(intent, requestCode)
    } else if (context is Fragment)
    {
      context.startActivityForResult(intent, requestCode)
    }
  }

 //  fragment
  fun getFragment(url: String): Fragment?
  {
    try
    {
      val cla = classMap[url]

      if (cla != null)
      {
        return cla.newInstance() as Fragment
      } else
      {

      }

    } catch (e: ClassNotFoundException)
    {
      e.printStackTrace()
    } catch (e: Exception)
    {
      e.printStackTrace()
    }
    return null
  }

3.구덩이 가 있다.
3.1
주석 해석 기 를 등록 할 때 구 글 의 autoservice 라 이브 러 리 를 사용 하지 마 십시오.resources,META-INF 를 사용 하 십시오.그렇지 않 으 면 효과 가 없습니다.왜 냐 고 묻 지 마,나 도 몰라.
3.2
gradle 파일 에 주석 해석 기 를 사용 하여 annotationProcessor 대신 kapt 을 사용 합 니 다.

apply plugin: 'kotlin-kapt'
dependencies {
kapt project(':processor')
api project(':router')
}
3.3
생 성 된 자바 파일 은 각 module 의 build/generated/source/kapt 에 있 습 니 다.
4.
사실은 전 회사 에 있 을 때 길 을 쓰 려 고 했 습 니 다.다만 여러 가지 이유 로 최근 에 모양 을 이 루 지 못 했 습 니 다.여 기 는 여러분 에 게 생각 을 제공 하 는 것 일 뿐 사고 문 으로서 주석 과 번역 을 보급 할 때 주석 해석 기 를 보급 하지 않 았 습 니 다.자 료 를 스스로 조회 하 십시오.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기