Log.e("Rain",selectInfo.getName() + "--------onActivityResult----------");
XRouter.getRouter().getActivityManager().onActivityResult(this, requestCode, resultCode, data);
}
服務(wù)的實(shí)現(xiàn)類
@Route(path = IActivityManagerService.PATH)
public class ActivityManagerImpl implements IProvider, IActivityManagerService {
private Context mContext;
private List
@Override
public void init(Context context) {
mContext = context;
}
@Override
public Context getContext() {
if (ActivityUtils.getTopActivity() == null)
return mContext;
else return ActivityUtils.getTopActivity();
}
@Override
public void addOnActivityResultListener(OnActivityResultListener listener) {
if(mOnActivityResultListeners == null){
mOnActivityResultListeners = new ArrayList<>();
}
if(!mOnActivityResultListeners.contains(listener)){
mOnActivityResultListeners.add(listener);
}
}
@Override
public void onActivityResult(Activity context, int requestCode, int resultCode, Intent data) {
if(mOnActivityResultListeners != null && !mOnActivityResultListeners.isEmpty()){
for(OnActivityResultListener listener : mOnActivityResultListeners){
listener.onActivityResult(context, requestCode, resultCode, data);
}
}
}
}
調(diào)用方式:
public IActivityManagerService getActivityManager() {
ActivityManagerImpl activityManagerImpl = (ActivityManagerImpl)ARouter.getInstance()
.build(IActivityManagerService.PATH)
.navigation();
return activityManagerImpl;
}
第二步我們需要做路由跳轉(zhuǎn)服務(wù)的實(shí)現(xiàn) 類似:
XRouter.getRouter()...startActivityForResult(new ResultCallback() {br/>@Override
public void onResponse(@NonNull Object data) {
}
});
Arouter調(diào)用build方法后返回一個(gè)PostCard,官方解釋**A container that contains the roadmap.**這是個(gè)路由信息的存儲(chǔ)器,里面包含頁(yè)面跳轉(zhuǎn)的所有信息。
那么我們跳轉(zhuǎn)時(shí)傳遞參數(shù)必須先拿到一個(gè)PostCard,通過(guò)PostCard可以傳遞我們目標(biāo)頁(yè)面所需的數(shù)據(jù)
Postcard mPostcard = ARouter.getInstance().build(path);
通過(guò)new NavigatorBuilder(String path)
可以拿到NavigatorBuilder對(duì)象:
NavigatorBuilder navigator = new NavigatorBuilder(path);
路由跳轉(zhuǎn)時(shí)我們需要的參數(shù)大致有path路徑,requestCode以及傳遞的數(shù)據(jù),如果使用靜態(tài)代理去實(shí)現(xiàn)的話,后期可能不太好維護(hù),那么一個(gè)更好的解決辦法就是使用注解+動(dòng)態(tài)代理,可以實(shí)現(xiàn)類Retrofit式使用,方便擴(kuò)展維護(hù)。
創(chuàng)建注解類:
//方法注解br/>@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Route {
/**
- 跳轉(zhuǎn)路徑
- @return
*/
String path();
/**
- 請(qǐng)求碼
- @return
*/
int requestCode() default -1;
}
//方法參數(shù)注解br/>@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
public @interface Extras {
}
使用:
public interface AppNavigator {
String _selectPage = "/select/contactActivity";
@Route(path = _selectPage)
ActivityNavigator
}
這時(shí)我們可以通過(guò)反射拿到AppNavigator
對(duì)象。
這里其實(shí)使用的是動(dòng)態(tài)代理,內(nèi)部也是通過(guò)Java反射機(jī)制實(shí)現(xiàn)的,即已知的一個(gè)對(duì)象,然后在運(yùn)行時(shí)動(dòng)態(tài)調(diào)用其方法,這樣在調(diào)用前后作一些相應(yīng)的處理。
try {
o = Proxy.newProxyInstance(navigator.getClassLoader(), new Class[]{navigator}, new InvocationHandler() {
LruCache
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
if (mNavigatorMethods == null) {
mNavigatorMethods = new LruCache<>(5);
}
NavigationMethod navigationMethod = mNavigatorMethods.get(method);
if (navigationMethod == null) {
// create methods processer
navigationMethod = new NavigationMethod(method);
mNavigatorMethods.put(method, navigationMethod);
}
return navigationMethod.invoke(args);
}
});
}catch (Exception e){
Log.e("Rain",e.getMessage() + "-----------");
}
//CLassLoader loader:被代理對(duì)象的類加載器
//Class> interfaces:被代理類全部的接口
//InvocationHandler h:實(shí)現(xiàn)InvocationHandler接口的對(duì)象,在調(diào)用方式時(shí)會(huì)調(diào)用它的invoke方法。
調(diào)用Proxy的newProxyInstance方法可以生成代理對(duì)象 ,實(shí)現(xiàn)InvocationHandler接口的對(duì)象,在調(diào)用方式時(shí)會(huì)調(diào)用它的invoke方法,可以看到這個(gè)方法中調(diào)用了被代理對(duì)象的方法: method.invoke(),所以我們可以在這里加上我們的業(yè)務(wù)邏輯。
NavigationMethod.class:
public Object invoke(Object[] args) {
NavigatorBuilder builder = XRouter.getRouter().build(mRoute.path())
《Android學(xué)習(xí)筆記總結(jié)+最新移動(dòng)架構(gòu)視頻+大廠安卓面試真題+項(xiàng)目實(shí)戰(zhàn)源碼講義》
【docs.qq.com/doc/DSkNLaERkbnFoS0ZF】 完整資料開源分享
;
Navigator navigator = builder
.withRequestCode(mRoute.requestCode())
.navigator();
return navigator;
}
我們?cè)贑ontactSelectInfoCallback中解析了返回的intent對(duì)象,并通過(guò)onResponse方法返回具體的數(shù)據(jù)對(duì)象。
public abstract class RouteCallback
public void onResponse(int requestCode, int resultCode, Intent data){
if(data != null){
try{
T parseData = parseData(requestCode, resultCode, data);
if(parseData != null){
onResponse(parseData);
}else{
onError(new RuntimeException("no data parsed"));
}
}catch(Exception e){
onError(new RuntimeException("an exception been catched when parsing data", e));
}
}else{
onCancel();
}
}
public abstract T parseData(int requestCode, int resultCode, @NonNull Intent data);
public abstract void onResponse(@NonNull T data);
public void onCancel(){}
public void onError(Throwable throwable){}
}
ok,基本工作完成
使用方式
1. 聲明Navigator接口
public interface AppNavigator {
String _selectPage = "/select/contactActivity";
//聲明返回類型為Navigator
@Route(path = _selectPage)
Navigator
}
2. 復(fù)寫onActivityResult方法
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
XRouter.getRouter().getActivityManager().onActivityResult(this, requestCode, resultCode, data);
}
3. 實(shí)現(xiàn)Callback,對(duì)回傳數(shù)據(jù)進(jìn)行解析處理
public abstract class ContactSelectInfoCallback extends RouteCallback
@Override
最后
Android學(xué)習(xí)是一條漫長(zhǎng)的道路,我們要學(xué)習(xí)的東西不僅僅只有表面的 技術(shù),還要深入底層,弄明白下面的 原理,只有這樣,我們才能夠提高自己的競(jìng)爭(zhēng)力,在當(dāng)今這個(gè)競(jìng)爭(zhēng)激烈的世界里立足。
人生不可能一帆風(fēng)順,有高峰自然有低谷,要相信,那些打不倒我們的,終將使我們更強(qiáng)大,要做自己的擺渡人。
資源持續(xù)更新中,歡迎大家一起學(xué)習(xí)和探討。
本文已被CODING開源項(xiàng)目:《Android學(xué)習(xí)筆記總結(jié)+移動(dòng)架構(gòu)視頻+大廠面試真題+項(xiàng)目實(shí)戰(zhàn)源碼》收錄