Skip to content

一款高效的组件间通信方案,0反射,仅需简单配置,即可方便的进行组件间通信

License

Notifications You must be signed in to change notification settings

WrBug/componentrouter

Repository files navigation

ComponentRouter

一款高效的组件间通信方案,0反射,仅需简单配置,即可实现在组件完全解耦的情况下的通信

使用

添加依赖

最新版本
模块 componentrouter
最新版本 Download

工程根目录build.gradle下添加:

dependencies {
    classpath "com.wrbug.componentrouter:gradle:$version"
}

各模块build.gradle添加

//仅在主工程添加即可
apply plugin: 'com.wrbug.componentroutergradle'
//============
implementation "com.wrbug.componentrouter:componentrouter:$version"
annotationProcessor "com.wrbug.componentrouter:compile:$version"

Application 初始化

@ObjectRoute(ObjectRoute.APPLICATION_PATH)
public class App extends Application {
    private static App instance;

    @Override
    public void onCreate() {
        instance = this;
        super.onCreate();
    }

    @SingletonRouter
    //获取application 实例,可根据项目自行配置
    public static App getInstance() {
        return instance;
    }
}

Application 初始化完成后,你可以在任意地方获取Application代理

  ComponentRouterInstance routerInstance = ComponentRouter.getApplication(); 
  Application app= routerInstance.getInstance();

使用1. (获取Fragment实例)

注册Service(AFragment提供给外部使用)
//注册服务
@ObjectRoute("/a/AFragment")
public class AFragment extends Fragment {
    private EditText et;

    //提供给外部实例化的构造方法
    @ConstructorRouter
    public AFragment() {
    }

    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        et = view.findViewById(R.id.et);
    }

    //提供给外部访问的方法
    @MethodRouter("getText")
    String getText() {
        return et.getText().toString();
    }

}
获取service代理(跨组件使用Fragment)
ComponentRouterInstance build=ComponentRouter.build("/a/AFragment");
//获取实例
Fragment fragment = build.getInstance();
if (fragment != null) {
    getSupportFragmentManager().beginTransaction().add(R.id.container, fragment).commitAllowingStateLoss();
}

//调用服务
String text = build.getProxy().call("getText");

使用2. (跨组件调用单例)

注册Service(UserManagerService提供sp服务给外部)
@ObjectRoute("/a/userManager")
public class UserManagerService {
    private static volatile UserManagerService instance;
    private Context mContext;
    private SharedPreferences mUserSharedPreferences;

    private UserManagerService(Context context) {
        mContext = context.getApplicationContext();
        mUserSharedPreferences = mContext.getSharedPreferences("user", Context.MODE_PRIVATE);
    }

    @SingletonRouter
    public static UserManagerService getInstance(Context context) {
        if (instance == null) {
            synchronized (UserManagerService.class) {
                if (instance == null) {
                    instance = new UserManagerService(context);
                }
            }
        }
        return instance;
    }

    @MethodRouter("saveUsername")
    public void saveUsername(String username) {
        mUserSharedPreferences.edit().putString("username", username).apply();
    }

    @MethodRouter("getUsername")
    public String getUsername() {
        return mUserSharedPreferences.getString("username", "");
    }

} 
获取service代理
// UserManagerService 存在 @SingletonRouter注解,build 也为单例
ComponentRouterInstance build = ComponentRouter.build("/a/userManager", this.getApplicationContext());
//保存username
build.getProxy().call("saveUsername", "WrBug");
//获取username
String username = build.getProxy().call("getUsername");

使用3. (结合第三方框架)

如果您已经通过第三方框架获取到Fragment实例,可以通过下面的方式使用服务

// 使用获取到Fragment
Fragment fragment = (Fragment) ARouter.getInstance().build("/test/fragment").navigation();

//fragment 的类需要有@ObjectRoute 注解,代理才能生效
ComponentRouterProxy proxy = ComponentRouter.createProxy(fragment);
String text=proxy.call("getText");

注解使用

类注解,参数path,服务类只有使用该注解,其他注解才会生效

构造方法注解,用于ComponentRouter.build()生成 代理实例,服务类中如有构造方法,将需要提供给外部的构造方法加上该注解

单例注解,用于获取服务类单例的静态方法,用法同ConstructorRouter,服务类中如使用@SingletonRouter@ConstructorRouter将自动失效,使用参考UserManagerService

方法注解,用于服务类提供给外部的方法,使用参考UserManagerService

ComponentRouter原理

正在补充

About

一款高效的组件间通信方案,0反射,仅需简单配置,即可方便的进行组件间通信

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published