關於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