您的位置:首页 > 运维架构 > 网站架构

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

2017-09-04 18:03 387 查看
上个月接到项目重构的任务,让设计一种高扩展性,模块耦合更低的轻量级的架构。于是我根据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(saved
4000
InstanceState);
setContentView(R.layout.activity_base);
}
}


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


下载代码:http://download.csdn.net/download/chen364567628/9996388
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息