【比你想的簡單很多!從0開始完成一款App】4.App初始化、設(shè)計主要結(jié)構(gòu)、封裝工具類

個人博客CoorChice,https://chenbingx.github.io/ ,最新文章將會首發(fā)CoorChice的博客,歡迎探索哦 !
同時,搜索微信公眾號CoorChice,或掃描文章末尾二維碼,可以關(guān)注我的微信公眾號。同期文章也將會優(yōu)先推送到微信公眾號中,以提醒您有新鮮文章出爐。

封面.jpg

本系列文章列表

通過前面幾篇你已經(jīng)準備好,可以開始輸入代碼,創(chuàng)建你的應用了。

App初始化

我們要自定義Application

默認情況下,系統(tǒng)會讓你的應用使用默認的Application,可以,這很方便。但是實際開發(fā)中,我們往往需要在應用程序一進去就開始一些初始化(初始化配置、加載后面要使用的資源)的操作,所以我們需要使用自己的Application。

  1. 首先extends Application,目前暫時只在其中初始化異常捕捉
public class ChiceApplication extends Application {

  private static Context context;
  @Override
  public void onCreate() {
    super.onCreate();
    context = this;
//    初始化異常處理類
    CrashHandler.getInstance().init(context);
  }

  //獲取系統(tǒng)級Context
  public static Context getAppContext(){
    return context;
  }
}
  1. 在AndroidManifest.xml中把<application>標簽的name屬性改成我們定義的這個Application。接下來,我們每次啟動應用時,系統(tǒng)將初始化我們的ChiceApplication
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.chenbing.oneweather">

  <application
    android:name=".ChiceApplication" //就是在這里修改為我們的Application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <activity android:name=".View.activitys.MainActivity">
      <intent-filter>
        <action android:name="android.intent.action.MAIN"/>

        <category android:name="android.intent.category.LAUNCHER"/>
      </intent-filter>
    </activity>
  </application>

</manifest>

編寫基類

Activity基類

我們的Activity繼承自v7兼容包下的AppComponentActivity。由于v7包提供了更多的特性,并且當今時代,我們并不需要考慮android 2.1之前的兼容性,試問你聽說過有誰在用2.1之前的Android機嗎?有的用戶可能喜歡刷機,但是網(wǎng)上的ROM也基本都是基于android 2.1以上,所以我就直接使用v7兼容包了。

//我們后續(xù)創(chuàng)建的Activity都需要繼承這個BaseActivity,這樣便于以后植入統(tǒng)一的操作。
//不然以后需要統(tǒng)一給Activity進行相同操作時,你就要一個個去改。真蛋疼啊!

//之所以寫成抽象,是為了規(guī)范約束,提醒你下面幾個方法是必要的
public abstract class BaseActivity extends AppCompatActivity {
  
  //初始化數(shù)據(jù)請求(不是必須的,習慣了)
  abstract protected void initData();

  //初始化View
  abstract protected void initView();

  //給View添加監(jiān)聽器
  abstract protected void addListener();

}

Fragment基類

Fragment我選擇繼承v4包的,因為app包下只支持4.4以上,對于現(xiàn)在的Android市場來說太高了。

public abstract class BaseFragment extends Fragment {

  abstract protected void initData();

  abstract protected void initView();

  abstract protected void addListener();
  @Override
  public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    view.setClickable(true); //讓Fragment最底層的View攔截事件,防止扯到蛋的點透
  }
}

BaseRelativeLayout

因為我比較喜歡使用RelativeLayout,所以選擇它做View的基類。這個基類可選,主要是為了方便創(chuàng)建自定義View。

public abstract class BaseRelativeLayout extends RelativeLayout {
  public BaseRelativeLayout(Context context) {
    this(context, null);
  }

  public BaseRelativeLayout(Context context, AttributeSet attrs) {
    this(context, attrs, 0);
  }

  public BaseRelativeLayout(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    bindView();
  }

  private void bindView() {
    LayoutInflater inflater = LayoutInflater.from(getContext());
    inflater.inflate(getLayout(), this, true);
    ButterKnife.bind(this);
  };

  //重寫這個方法就能加載布局了。
  abstract protected int getLayout();
}

BaseItemViewHolder

這個是專門為RecyclerView設(shè)計的ViewHolder,目的是為了簡化ViewHolder的使用。

public class BaseItemViewHolder extends RecyclerView.ViewHolder {
  public BaseItemViewHolder(View itemView) {
    super(itemView);
  }
}

//看看RecyclerView的Adapter現(xiàn)在的變化
@Override
  public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    return new BaseItemViewHolder(new NavigatorItemView(context)); //一句話創(chuàng)建
  }

設(shè)計主要架構(gòu)

本項目我們采用時下流行的MVP框架,現(xiàn)在針對MainActtivity先來進行結(jié)構(gòu)設(shè)計。設(shè)計結(jié)構(gòu)時需要注意以下幾點:

  • 遵循依賴倒置原則,即模塊應該依賴抽象,而不要依賴具體。這樣做的的好處是,單需求發(fā)生變化,比如Model需要切換邏輯時,我們只需要換一個實現(xiàn)了同一個接口的實現(xiàn)類就可以,而不用對Presenter修改。同樣,當我們現(xiàn)有的一套Presenter和Model需要在另一個View模塊上展示時,只要View模塊不要求View接口發(fā)生變化,我們可以很容易的就把這套東西用到新的View模塊上。當然,理論上可行,但實際的Android開發(fā)中往往是View模塊占據(jù)主導地位,至少大多數(shù)時候是這樣。
  • 使用MVP框架其實就已經(jīng)注定了代碼量會增大,所以不能為了省事把Model模塊的邏輯、算法代碼寫到Presenter中。
  • 要注意我們的依賴關(guān)系。
MVP依賴關(guān)系

下面看看View、Model、Presenter的結(jié)構(gòu)。

View模塊

//抽象
//我們的Presenter需要依賴的就是這個抽象
public interface MainActivityView extends MvpView {

}

//具體實現(xiàn)
public class MainActivity extends BaseActivity implements MainActivityView {
  private MainActivityPresenterApi presenter;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    presenter = new MainActivityPresenter(this); //初始化Presenter
    //下面調(diào)用方法我沒有固定,就是為了根據(jù)需求變化。當然大多數(shù)情況下是這樣的。
    initData();
    initView();
    addListener();
  }

  @Override
  protected void initData() {

  }

  @Override
  protected void initView() {

  }

  @Override
  protected void addListener() {

  }
}

Model模塊

//抽象
public interface MainActivityModelApi {
}

//實現(xiàn)
public class MainActivityModel implements MainActivityModelApi {
}

Presenter模塊

//抽象
public interface MainActivityPresenterApi {
}

//實現(xiàn)
public class MainActivityPresenter implements MainActivityPresenterApi {

  private MainActivityView view; //依賴的是抽象
  private MainActivityModelApi model;

  public MainActivityPresenter(MainActivityView view) {
    this.view = view;
    model = new MainActivityModel(); //創(chuàng)建Model真實對象
  }
}

封裝工具類

工具類基本上都是提供一些靜態(tài)方法供外界調(diào)用的。

工具類

根據(jù)自己的需要來就行,我暫時封裝這么多,有需要再加,具體的到我的GitHub中看。下面我簡單介紹下他們的作用。

工具類根據(jù)實際開發(fā),可繼續(xù)不斷的擴展添加。

項目地址GitHub

CoorChice的公眾號
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容