关于Android模块化、低耦合、高扩展性的架构设计

上个月接到项目重构的任务,让设计一种高扩展性,模块耦合更低的轻量级的架构。于是我根据app的业务和模块划分最终设计出了如下架构,该架构适合模块较多,模块中联系较低的app。根据近一个月的实战验证,确定了该架构的可信性和很高的扩展性、代码复用性,另外该架构使得代码结构更加清晰,更容易维护。该架构符合android组件化、模块化开发的思想。

1、该架构看起来比较重比较繁琐,但是对于团队开发来说却能极大地提升工作效率。

2、次架构分为五层,最下层是通用的工具类和网络框架(通过代理模式封装过的),另外所有的第三方SDK、融云、等都加入到该层被上层依赖。次下层是共同业务处理的module,比如存数据库、文件相关操作等,第三层是各模块间通用的自定义view,例如下拉刷新的listview,以及关联比较紧密的模块(或者在第二层单独成module)。第二层是相对独立的模块,通过分module进行开发能很好控制和维护,极大提升了效率。最上层是整个app的入口层,可以是任何模块,由于业务的原因我们将登陆模块作为了入口。

3、最上层模块通过依次依赖下层的模块来实现功能。

4、模块内部通过MVP进行开发,封装了业务,使得业务代码复用性更高,封装了内部细节,符合面向对象的设计思想。

5、如果有类似业务app可以直接复制module进行依赖。

需要注意的是:因为是团队开发,应该多交流,不要把不共用的全部放在最底层,这样能避免架构被破坏。

当然这个层次结构是种比较理想化的架构,可以根据app做分层删减,比如:


这个相比就把所有模块放在一个module中按包划分,适合与关系紧密的模块。相比而言我更喜欢第一种,因为我们是个团队,都喜欢文件夹少点这样看起来也清爽。

当然你还可以删减:

不管怎么删减,这种设计适合mvp设计模式,你们喜欢的可以试试,每个module之间通过依赖联系。


当然我们公司最终还是选择了第一种,你们觉得这样设计是合理还是麻烦呢?

相关问题,如何解决下层activity调用,同级activity和上层activtiy?如下通过接口回调,BaseActivity分发接口对象到所有activtiy中,接口对象通过调用MainActivity进行启动其他activity。

入口act中初始化接口对象

public class MainActivity extends BaseActivity implements StartContact {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        startContact = this;

        Button tomail = (Button) findViewById(R.id.tomail);
        tomail.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(MainActivity.this, MailActivity.class);
                startActivity(intent);
            }
        });
    }


    @Override
    public void startContact(Activity activity,int requestCode) {
        activity.startActivityForResult(new Intent(activity,ContactActivity.class),requestCode);
    }

    @Override
    public void startMail(Activity activity, int resultCode, String str) {
        Intent intent = new Intent();
        intent.putExtra("select",str);
        activity.setResult(resultCode,intent);
        activity.finish();
    }
}

库中回调接口,邮件模块

public class MailActivity extends BaseActivity {
    private TextView tv;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_mail);
        tv = (TextView) findViewById(R.id.setGetDate);
        Button selectContact = (Button) findViewById(R.id.selectContact);
        selectContact.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startContact.startContact(MailActivity.this,100);
            }
        });
    }
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        Log.e("cs","sdwetertre");
        if (requestCode==100 && resultCode==101 && data!=null){
            String select = data.getStringExtra("select");
            if (!TextUtils.isEmpty(select.trim())) {
                tv.setText(select);
            }
        }
    }
}
联系人模块,
public class ContactActivity extends BaseActivity {
    public String str="";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_contact);

        Button complete = (Button) findViewById(R.id.complete);

        complete.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startContact.startMail(ContactActivity.this,101,str);
            }
        });

        RadioGroup rg = (RadioGroup) findViewById(R.id.rg);

        rg.check(0);
        rg.check(R.id.rb1);
        str = "Mekhi";
        rg.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(RadioGroup group, @IdRes int checkedId) {
               if (checkedId==R.id.rb1)  {
                   str = "Mekhi";
               }else     if (checkedId==R.id.rb2)   {
                   str = "chen";
               }else    if (checkedId==R.id.rb3)  {
                   str = "男";
               }else     if (checkedId==R.id.rb4){
                   str = "女";
               }
            }
        });
    }
}
baseAct

public class BaseActivity extends Activity {
    public static StartContact startContact;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_base);
    }
}


其中
BaseActivity 负责分发startContact接口对象,使之形成回调对象,MainActivity 负责初始化接口对象。


下载代码:http://download.csdn.net/download/chen364567628/9996388







  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值