Android 경로 프레임 워 크 ARouter 사용 예제

1.의존 도 를 추가 하고 프레임 워 크 를 초기 화 합 니 다.
1.의존 도 추가
ARouter 를 사용 해 야 하 는 module 에 다음 코드 를 추가 합 니 다.
1.1 자바 버 전의 의존

android {
    defaultConfig {
        ...
        javaCompileOptions {
            annotationProcessorOptions {
                arguments = [moduleName :project.getName() ]
            } }
    }
}

dependencies {
    api 'com.alibaba:arouter-api:1.5.1'
    annotationProcessor 'com.alibaba:arouter-compiler:1.5.1'
}
1.2,kotlin 버 전의 의존

plugins {
    ...
    id 'kotlin-kapt'
}

dependencies {
    ...
    implementation 'com.alibaba:arouter-api:1.5.1'
    kapt 'com.alibaba:arouter-compiler:1.5.1'
}
주제:implementation 과 api 키 워드 는 Android studio 3.0 버 전에 서 copile 키 워드 는 버 려 졌 고 api 는 copile 의 대체 품 이 며 api 는 copile 과 다 르 지 않 습 니 다.그러나 최근 공식 적 으로 는 compile 키 워드 를 대신 해 implementation 을 사용 하 는 것 을 추천 합 니 다.implementation 은 안 드 로 이 드 스튜디오 의 컴 파일 속 도 를 더욱 빠르게 할 것 이 라 고 합 니 다.
한편,implementation 과 api 키워드 의 차 이 는 implementation 으로 설명 하 는 의존 패 키 지 는 현재 module 내부 에서 만 사용 되 며,module 에 의존 하 는 모듈 에 서 는 이 의존 패 키 지 를 사용 할 수 없습니다.api 로 패키지 에 의존 할 때 이 모듈 에 의존 하 는 모듈 은 모듈 내 의존 패 키 지 를 정상적으로 사용 할 수 있 습 니 다.
여기 서 저 는 이 를 공공 module 에 넣 어서 app module 에 의존 하 게 하기 때문에 api 키 워드 를 사용 합 니 다.프로젝트 를 구성 요소 화하 지 않 으 면 implementation 키 워드 를 사용 하여 의존 할 수 있 습 니 다.
2.SDK 초기 화

//   ARouter  
private boolean isDebugARouter = true;//ARouter    
if (isDebugARouter) {
    //        init  ,       init    
    ARouter.openLog();
    //      (   InstantRun     ,        !
    //         ,       )
    ARouter.openDebug();
}
//      Application    
ARouter.init((Application) mContext);
2.ARouter 의 간단 한 사용
1.인터페이스 점프
1.1,활동 인터페이스 점프
대상 Activity 에 주석 을 추가 합 니 다.(전환 문 구 는 경로 가 상수 로 쓰 고 경로 표를 만들어 통일 적 으로 관리 하 는 것 을 권장 합 니 다.)

@Route(path = "/app/login")
public class LoginActivity extends AppCompatActivity {
Activity 보 내기

ARouter.getInstance().build("/app/login").navigation();
1.2,fragment 인 스 턴 스 가 져 오기

//    
@Route(path = "/app/fragment")
public class EmptyFragment extends BaseFragment {
}

//    
Fragment fragment= (Fragment) ARouter.getInstance().build("/app/fragment").navigation();
FragmentManager manager = getSupportFragmentManager();
FragmentTransaction transaction = manager.beginTransaction();
transaction.add(R.id.fl_fragment_content, fragment);
transaction.commit();
1.3.주의사항
나 처럼 프로젝트 를 구성 화 한 학생 들 은 이때 점프 가 성공 하지 못 하고 잘못된 힌트 를 꺼 내 는 것 을 발견 할 수 있 을 것 이다.

이것 은 구성 요소 화 된 후에 api 를 의존 하 는 키워드 로 사 용 했 지만 ARouter 를 사용 하 는 다른 module 에서 코드 를 설정 해 야 하기 때 문 입 니 다.여기 서 일반적인 습관 적 인 방법 은 arouter-api 의 의존 을 기본 서비스의 module 에 두 는 것 입 니 다.구성 요 소 를 사용 한 이상 모든 module 은 arouter-api 라 이브 러 리 에 의존 해 야 하고 arouter-copiler 의 의존 은 모든 module 에 넣 어야 하기 때 문 입 니 다.
java

android {
    defaultConfig {
        ...
        javaCompileOptions {
            annotationProcessorOptions {
                arguments = [moduleName :project.getName() ]
            } }
    }
}

dependencies {
    annotationProcessor 'com.alibaba:arouter-compiler:1.5.1'
}
kotlin

plugins {
    ...
    id 'kotlin-kapt'
}

dependencies {
    ...
    kapt 'com.alibaba:arouter-compiler:1.5.1'
}
그렇지 않 으 면 경로 와 일치 하지 않 고 withObject 방법 으로 대상 을 휴대 할 때 도 잘못 보고 할 수 있 습 니 다.이 다음 에 다시 한 번 말씀 드 리 겠 습 니 다.화면 이 성공 적 으로 뛰 는 것 을 다시 한 번 시도 해 보 세 요.주석@Route 의 path 매개 변수 에 대해 서도 규범 에 주의해 야 합 니 다."/"로 시작 하고 경 로 는 적어도 2 급 이 어야 합 니 다.그렇지 않 으 면 컴 파일 이 통과 되 지 않 거나 오류 가 발생 할 수 있 습 니 다.

경 로 는 반드시'/'로 시작 해 야 하 며,포 함 된 값 이 2 개'/'를 초과 해 야 한 다 는 뜻 이다.
2.기본 매개 변 수 를 가 진 인터페이스 전환
사용 방법 은 다음 과 같 습 니 다.입력 값 쌍 입 니 다.

Bundle bundle = new Bundle();
bundle.putString("bundleStringKey", "bundleStringValue");

ARouter.getInstance().build("/app/login")
             .withString("stringKey", "stringValue")
             .withInt("intKey", 100)
             .withBoolean("booleanKey", true)
             .withBundle("bundle", bundle)
             .navigation();
대상 인터페이스 에서@Autowired 주 해 를 사용 하여 주입

@Route(path = "/app/login")
public class LoginActivity extends AppCompatActivity {
    @Autowired
    String stringKey;
    @Autowired
    int intKey;
    @Autowired
    boolean booleanKey;
    @Autowired
    Bundle bundle;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);
        //  ARouter
        ARouter.getInstance().inject(this);
        
        Log.e(TAG, stringKey + "..." + intKey + "..." + booleanKey);
        Log.e(TAG, bundle.getString("bundleStringKey"));
    }
}
메모:주 입 된 속성 명 은 이전에 가지 고 있 던 key 값 과 완전히 같 아야 하 며,주입 할 인터페이스 에서 ARouter.getInstance().inject(this)를 통 해 ARouter 를 주입 해 야 합 니 다.그렇지 않 으 면 주입 에 성공 할 수 없습니다.ARouter.getInstance().inject(this)작업 을 BaseActivity 의 onCreate 방법 에 넣 어 진행 하 는 것 을 권장 합 니 다.주입 이 있 는 이상 반드시 자원 의 방출 이 있 기 때문에 방출 자원 은 응용 프로그램 에서 진행 된다.

    @Override
    public void onTerminate() {
        super.onTerminate();
        ARouter.getInstance().destroy();
    }
BaseActivity 의 onDestroy 방법 에 자원 을 방출 하면 ARouter.getInstance().destroy()를 호출 합 니 다.대상 Activity 에 들 어간 후에 back 키 를 눌 러 원래 화면 으로 돌아 갈 때 APP 는 충돌 을 잘못 알 립 니 다.다음은 충돌 로그 입 니 다.

3.소지 대상 의 인터페이스 점프
3.1 직렬 화 대상 을 가 진 인터페이스 전환
Serializable 과 Parcelable 을 가지 고 서열 화 된 대상

TestSerializableBean serializableBean = new TestSerializableBean();
serializableBean.setName("serializable");

TestParcelableBean parcelableBean = new TestParcelableBean();
parcelableBean.setName("parcelable");

ARouter.getInstance().build("/app/login")
        .withParcelable("parcelableBean", parcelableBean)
        .withSerializable("serializableBean", serializableBean)
        .navigation();
목표 인터페이스

@Autowired
TestParcelableBean parcelableBean;
@Autowired
TestSerializableBean serializableBean;

@Override
protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);
        Log.e(TAG, parcelableBean + "");
        Log.e(TAG, serializableBean + "");
}

Serializable 서열 화 대상 이 null 인 것 을 발 견 했 습 니 다.withSerializable 방법 을 살 펴 보 니 Bundle 에 들 어 갔 습 니 다.

public Postcard withSerializable(@Nullable String key, @Nullable Serializable value) {
        mBundle.putSerializable(key, value);
        return this;
    }
그래서 다른 방법 으로 값 을 뽑 았 는데 인쇄 에 성 공 했 습 니 다.

TestSerializableBean serializableBean = (TestSerializableBean) getIntent().getExtras().getSerializable("serializableBean");
Log.e(TAG, serializableBean + "");

3.2 직렬 화 대상 이 없 는 인터페이스 전환
직렬 화 되 지 않 은 대상 도 withObject 대상 을 통 해 전달 할 수 있 으 며 수신 방식 이 같 습 니 다.

NormalTest normalTest = new NormalTest();
normalTest.setName("normal");
ARouter.getInstance().build("/app/login")
        .withObject("normalTest", normalTest)
        .navigation();
그러나 우 리 는 이 방법 을 직접 사용 하면 오류 가 발생 할 수 있 습 니 다.소스 코드 를 분석 한 결과 이 방법 에 SerializationService 가 사용 되 었 습 니 다.

    public Postcard withObject(@Nullable String key, @Nullable Object value) {
        serializationService = ARouter.getInstance().navigation(SerializationService.class);
        mBundle.putString(key, serializationService.object2Json(value));
        return this;
    }
그래서 우 리 는 이 서 비 스 를 실현 해 야 한다.

@Route(path = "/service/json")
public class JsonServiceImpl implements SerializationService {
    private Gson gson;

    @Override
    public <T> T json2Object(String input, Class<T> clazz) {
        return gson.fromJson(input, clazz);
    }

    @Override
    public String object2Json(Object instance) {
        return gson.toJson(instance);
    }

    @Override
    public <T> T parseObject(String input, Type clazz) {
        return gson.fromJson(input, clazz);
    }

    @Override
    public void init(Context context) {
        gson = new Gson();
    }
}
필요 한 json 해상도 기 를 정의 하여 인쇄 대상 을 다시 실행 할 수 있 습 니 다.그 서열 화 된 대상 은 이 방법 으로 전달 할 수 있 습 니까?

TestParcelableBean objParcelableBean = new TestParcelableBean();
objParcelableBean.setName("objParcelable");

TestSerializableBean objSerializableBean = new TestSerializableBean();
objSerializableBean.setName("objSerializable");

NormalTest normalTest = new NormalTest();
normalTest.setName("normal");

ARouter.getInstance().build("/app/login")
        .withObject("objParcelableBean", objParcelableBean)
        .withObject("objSerializableBean", objSerializableBean)
        .withObject("normalTest", normalTest)
        .navigation();

//    
@Autowired(name = "objParcelableBean")
TestParcelableBean objParcelableBean;
@Autowired(name = "objSerializableBean")
TestSerializableBean objSerializableBean;
@Autowired(name = "normalTest")
NormalTest normalTest;

Log.e(TAG, objParcelableBean + "");
Log.e(TAG, objSerializableBean + "");
Log.e(TAG, normalTest + "");

우 리 는 Parcelable 로 서열 화 된 대상 이 비어 있 는 것 을 발견 하고 build 의 컴 파일 파일 파일 을 분석 합 니 다.

@Override
  public void inject(Object target) {
    serializationService = ARouter.getInstance().navigation(SerializationService.class);
    LoginActivity substitute = (LoginActivity)target;
    substitute.objParcelableBean = substitute.getIntent().getParcelableExtra("objParcelableBean");
    if (null != serializationService) {
      substitute.objSerializableBean = serializationService.parseObject(substitute.getIntent().getStringExtra("objSerializableBean"), new com.alibaba.android.arouter.facade.model.TypeWrapper<TestSerializableBean>(){}.getType());
    } else {
      Log.e("ARouter::", "You want automatic inject the field 'objSerializableBean' in class 'LoginActivity' , then you should implement 'SerializationService' to support object auto inject!");
    }
    if (null != serializationService) {
      substitute.normalTest = serializationService.parseObject(substitute.getIntent().getStringExtra("normalTest"), new com.alibaba.android.arouter.facade.model.TypeWrapper<NormalTest>(){}.getType());
    } else {
      Log.e("ARouter::", "You want automatic inject the field 'normalTest' in class 'LoginActivity' , then you should implement 'SerializationService' to support object auto inject!");
    }
  }
Parcelable 방식 으로 서열 화 된 대상 만 SerializationService 를 사용 하지 않 고 Bundle 에서 직접 가 져 오 는 것 을 볼 수 있 습 니 다.그러나 저 희 는 withParcelable 방법 으로 설정 한 값 이 아니 기 때문에 얻 은 데 이 터 는 null 입 니 다.
소결:따라서 우리 의 조작 을 편리 하 게 하기 위해 직렬 화 되 지 않 고 Serializable 직렬 화 된 대상 은 withObject 방법 으로 전달 되 며,Parcelable 방식 으로 직렬 화 된 대상 은 withParcelable 방법 으로 전달 된다.
3.3 집합 과 배열 을 가 진 인터페이스 전환
집합 과 배열 의 인터페이스 전환 은 withObject 방법 으로 통일 적 으로 전달 되 고 구성원 들 의 각종 직렬 화 방식 을 지원 할 수 있 습 니 다.

 List<NormalTest> listNormal = new ArrayList<>();
 listNormal.add(new NormalTest());
 listNormal.add(new NormalTest());

 List<TestSerializableBean> listSerializable = new ArrayList<>();
 listSerializable.add(new TestSerializableBean());
 listSerializable.add(new TestSerializableBean());

 List<TestParcelableBean> listParcelable = new ArrayList<>();
 listParcelable.add(new TestParcelableBean());
 listParcelable.add(new TestParcelableBean());

 Map<String, NormalTest> map = new HashMap<>();
 map.put("1", new NormalTest());
 map.put("2", new NormalTest());

 ARouter.getInstance().build("/app/login")
         .withObject("listNormal", listNormal)
         .withObject("listSerializable",listSerializable)
         .withObject("listParcelable",listParcelable)
         .withObject("map", map)
         .navigation();

 //    
 @Autowired
 List<NormalTest> listNormal;
 @Autowired
 List<TestSerializableBean> listSerializable;
 @Autowired
 List<TestParcelableBean> listParcelable;
 @Autowired
 Map<String, NormalTest> map;

 Log.e(TAG, listNormal + "");
 Log.e(TAG, listSerializable + "");
 Log.e(TAG, listParcelable + "");
 Log.e(TAG, map + "");

4.화면 전환 반전

//    
ARouter.getInstance().build("/app/login")
        .navigation(MainActivity.this, REQUEST_CODE);

@Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == REQUEST_CODE&& resultCode == RESULT_CODE) {
            LogUtils.e(data.getStringExtra("data"));
        }
    }


//    
Intent intent = new Intent();
intent.putExtra("data", "resultData");
setResult(RESULT_CODE, intent);
finish();
5.사용 하지 않 은 지식 포인트
프로젝트 에 ARouter 차단기,ARouter 사용자 정의 그룹 을 사용 하지 않 았 기 때문에 이 두 가지 지식 점 은 연구 하지 않 았 습 니 다.
이상 은 안 드 로 이 드 경로 프레임 워 크 ARouter 의 사용 예제 에 대한 상세 한 내용 입 니 다.안 드 로 이 드 경로 프레임 워 크 ARouter 의 사용 에 관 한 자 료 는 다른 관련 글 을 주목 하 십시오!

좋은 웹페이지 즐겨찾기