Android 경로 프레임 워 크 ARouter 사용 예제
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 의 사용 에 관 한 자 료 는 다른 관련 글 을 주목 하 십시오!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 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에 따라 라이센스가 부여됩니다.