成都android培训
达内成都高升桥中心

18684047202

热门课程

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

  • 时间:2018-01-19 16:36
  • 发布:成都达内
  • 来源:成都达内

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

<a style='color:blue' href='http://cd.android.tedu.cn/'>成都android培训</a>

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

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

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

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

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

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

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

成都android培训

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

当然你还可以删减:

成都android培训

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

成都android培训

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

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

入口act中初始化接口对象

[html] view plain copy print?

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();

}

}

库中回调接口,邮件模块

[html] view plain copy print?

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

}

}

}

}

联系人模块,

[html] view plain copy print?

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

[html] view plain copy print?

public class BaseActivity extends Activity {

public static StartContact startContact;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_base);

}

}

其中

[html] view plain copy print?

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

上一篇:Android/IOS APP开发怎么入门?
下一篇:Android基础-常用基础控件

Android开发架构思考及经验总结(七)

Android开发架构思考及经验总结(六)

Android开发架构思考及经验总结(五)

Android开发架构思考及经验总结(四)

选择城市和中心
贵州省

广西省

海南省