1. 程式人生 > >關於Android模組化、低耦合、高擴充套件性的架構設計

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