上个月接到项目重构的任务,让设计一种高扩展性,模块耦合更低的轻量级的架构。于是我根据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 负责初始化接口对象。