Log.e("Rain",selectInfo.getName() + "--------onActivityResult----------");
XRouter.getRouter().getActivityManager().onActivityResult(this, requestCode, resultCode, data);
}

服務的實現類

@Route(path = IActivityManagerService.PATH)
public class ActivityManagerImpl implements IProvider, IActivityManagerService {

private Context mContext;

private List mOnActivityResultListeners;

@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);
}
}
}
}

調用方式:

public IActivityManagerService getActivityManager() {
ActivityManagerImpl activityManagerImpl = (ActivityManagerImpl)ARouter.getInstance()
.build(IActivityManagerService.PATH)
.navigation();
return activityManagerImpl;
}

第二步我們需要做路由跳轉服務的實現 類似:

XRouter.getRouter()...startActivityForResult(new ResultCallback() {br/>@Override
public void onResponse(@NonNull Object data) {

}
});

Arouter調用build方法后返回一個PostCard,官方解釋**A container that contains the roadmap.**這是個路由信息的存儲器,里面包含頁面跳轉的所有信息。

那么我們跳轉時傳遞參數必須先拿到一個PostCard,通過PostCard可以傳遞我們目標頁面所需的數據

Postcard mPostcard = ARouter.getInstance().build(path);

通過new NavigatorBuilder(String path) 可以拿到NavigatorBuilder對象:

NavigatorBuilder navigator = new NavigatorBuilder(path);

路由跳轉時我們需要的參數大致有path路徑,requestCode以及傳遞的數據,如果使用靜態代理去實現的話,后期可能不太好維護,那么一個更好的解決辦法就是使用注解+動態代理,可以實現類Retrofit式使用,方便擴展維護。

創建注解類:

//方法注解br/>@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Route {

/**

/**

}

//方法參數注解br/>@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
public @interface Extras {
}

使用:

public interface AppNavigator {
String _selectPage = "/select/contactActivity";

@Route(path = _selectPage)
ActivityNavigator toSelectContactPage(@Extras Bundle bundle);
}

這時我們可以通過反射拿到AppNavigator 對象。

這里其實使用的是動態代理,內部也是通過Java反射機制實現的,即已知的一個對象,然后在運行時動態調用其方法,這樣在調用前后作一些相應的處理。

try {
o = Proxy.newProxyInstance(navigator.getClassLoader(), new Class[]{navigator}, new InvocationHandler() {
LruCache mNavigatorMethods;
br/>@Override
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:被代理對象的類加載器
//Class interfaces:被代理類全部的接口
//InvocationHandler h:實現InvocationHandler接口的對象,在調用方式時會調用它的invoke方法。

調用Proxy的newProxyInstance方法可以生成代理對象 ,實現InvocationHandler接口的對象,在調用方式時會調用它的invoke方法,可以看到這個方法中調用了被代理對象的方法: method.invoke(),所以我們可以在這里加上我們的業務邏輯。

NavigationMethod.class:
public Object invoke(Object[] args) {
NavigatorBuilder builder = XRouter.getRouter().build(mRoute.path())

《Android學習筆記總結+最新移動架構視頻+大廠安卓面試真題+項目實戰源碼講義》

【docs.qq.com/doc/DSkNLaERkbnFoS0ZF】 完整資料開源分享

;
Navigator navigator = builder
.withRequestCode(mRoute.requestCode())
.navigator();
return navigator;
}

我們在ContactSelectInfoCallback中解析了返回的intent對象,并通過onResponse方法返回具體的數據對象。

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, T為需要解析的回傳數據類型
@Route(path = _selectPage)
Navigator toSelectContactPage(@Extras Bundle ss);
}

2. 復寫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. 實現Callback,對回傳數據進行解析處理

public abstract class ContactSelectInfoCallback extends RouteCallback {
@Override

最后

Android學習是一條漫長的道路,我們要學習的東西不僅僅只有表面的 技術,還要深入底層,弄明白下面的 原理,只有這樣,我們才能夠提高自己的競爭力,在當今這個競爭激烈的世界里立足。

人生不可能一帆風順,有高峰自然有低谷,要相信,那些打不倒我們的,終將使我們更強大,要做自己的擺渡人。

資源持續更新中,歡迎大家一起學習和探討。

本文已被CODING開源項目:《Android學習筆記總結+移動架構視頻+大廠面試真題+項目實戰源碼》收錄