原创

Android组件化之不同模块间 交互(activity互相跳转,数据互相传递,互相调用函数)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://gaolei.blog.csdn.net/article/details/77601027

 转载请标明地址:https://blog.csdn.net/gaolei1201/article/details/77601027

在组件化之前,业务发展不是很快的时候,这样是比较合适的,能一定程度地保证开发效率。

慢慢地代码量多了起来,开发人员也多了起来,业务发展也快了起来,或者由多个项目其实可以共用一些模块时,这时单一工程开发模式就会显露出一些弊端:

  • 耦合比较严重(因为没有明确的约束,「组件」间引用的现象会比较多)
  • 业务模块重用性较差
  • 业务方的开发效率不够高(只关心自己的组件,却要编译整个项目,与其他不相干的代码糅合在一起)

为了解决这些问题,就采取了「组件化」策略它能带来这些好处:

  • 加快编译速度(不用编译主客那一大坨代码了)
  • 业务模块可以在不同项目中应用
  • 方便QA有针对性地测试
  • 提高业务开发效率
  •  

下面的这张图是项目依赖关系

由于组件化的内容网上资料较多,我来讲一些不一样的。模块化是用来降低耦合度,但是有时候难免会和其他模块有些交互(这也是自己在公司开发项目中遇到的) ,一个模块可以调用被依赖模块的类方法,而被依赖模型不能引入依赖模块类。简而言之就是,依赖只能单向,不能是双向,就算你想Android Studio也不让。但有时候被依赖的模块也需要一些依赖模块的数据怎么办?我就讲一下不同模块之间怎么交互的。

一、Activity之间跳转,有几种方式:

1.隐式Intent,要跳转的活动在Manifest.xml中声明,然后调用startActivity(new Intent(“com.example.boost”))

<activity android:name="com.example.boost.BoostActivity">
   <intent-filter>
        <action android:name="com.gaolei" />
    </intent-filter>
</activity>


2. manifest.xml中活动的数据设计URI来接受跳转,然后调用startActivity(new Intent(Intent.ACTION_VIEW,Uri.parse(“activity:// applock”)))。更多内容可了解路由器:https ://blog.csdn.net/zhaoyanjun6/article/details/76165252

<activity
    android:name=".module.ui.activity.RecommendGuideActivity">
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
        <data android:scheme="activity" />
        <data android:host="applock" />
    </intent-filter>
</activity>

3.利用反射

Class clazz=Class.fromName("com.clean.spaceplus.MainActivity")
startActivity(this,clazz);

如图4所示,可以看演示中的代码,就是把不同模块的一些类注册到一个都依赖的模块(如项目中的接口的ModuleDelegate),然后一个模块就可以电子杂志到其他模块的一些类对象,从而调用那个类的方法进行一些操作,如跳转一些活动。

下面是ModuleDelegate来注册不同模块的一些类,供其他模块调用

public class CleanDelegate {

    private final Map<String, IDelegateFactory> factoryMap = new HashMap<>();

    private static final CleanDelegate mInstance = new CleanDelegate();

    private CleanDelegate() {
    }

    public static CleanDelegate getInstance() {
        return mInstance;
    }

    public static void register(String key, IDelegateFactory factory) {
        mInstance.factoryMap.put(key, factory);
    }

    public Bundle getData(String factoryCode, int code, Bundle args, Object... extras) throws DelegateException {
        IDelegateFactory factory = factoryMap.get(factoryCode);
        if (factory != null) {
            IDataDelegate transfer = factory.getDataTransfer(code);

            if (transfer != null) {
                return transfer.getData(args, extras);
            }
        }

        throw new DelegateException("unknow data transfer");
    }
}

4. 推荐使用阿里开源第三方框架ARouter,详情可搜索相关文章

二、模块间如何通信,也有几种方法

1. 推荐使用第三方框架EventBus,详情可搜索相关文章

2. 通过Arouter

 

演示地址:https://github.com/gaoleicoding/Modularizationhttps//github.com/gaoleiandroid1201/MultiModuleInteraction

文章最后发布于: 2017-08-26 14:56:35
展开阅读全文
0 个人打赏
私信求帮助

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 书香水墨 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览