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

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

封面.jpg

本系列文章列表

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

App初始化

我們要自定義Application

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

  //獲取系統級Context
  public static Context getAppContext(){
    return context;
  }
}
  1. 在AndroidManifest.xml中把<application>標簽的name屬性改成我們定義的這個Application。接下來,我們每次啟動應用時,系統將初始化我們的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機嗎?有的用戶可能喜歡刷機,但是網上的ROM也基本都是基于android 2.1以上,所以我就直接使用v7兼容包了。

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

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

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

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

}

Fragment基類

Fragment我選擇繼承v4包的,因為app包下只支持4.4以上,對于現在的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的基類。這個基類可選,主要是為了方便創建自定義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設計的ViewHolder,目的是為了簡化ViewHolder的使用。

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

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

設計主要架構

本項目我們采用時下流行的MVP框架,現在針對MainActtivity先來進行結構設計。設計結構時需要注意以下幾點:

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

下面看看View、Model、Presenter的結構。

View模塊

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

}

//具體實現
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
    //下面調用方法我沒有固定,就是為了根據需求變化。當然大多數情況下是這樣的。
    initData();
    initView();
    addListener();
  }

  @Override
  protected void initData() {

  }

  @Override
  protected void initView() {

  }

  @Override
  protected void addListener() {

  }
}

Model模塊

//抽象
public interface MainActivityModelApi {
}

//實現
public class MainActivityModel implements MainActivityModelApi {
}

Presenter模塊

//抽象
public interface MainActivityPresenterApi {
}

//實現
public class MainActivityPresenter implements MainActivityPresenterApi {

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

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

封裝工具類

工具類基本上都是提供一些靜態方法供外界調用的。

工具類

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

工具類根據實際開發,可繼續不斷的擴展添加。

項目地址GitHub

CoorChice的公眾號
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,702評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,143評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,553評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,620評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,416評論 6 405
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,940評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,024評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,170評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,709評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,597評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,784評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,291評論 5 357
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,029評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,407評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,663評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,403評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,746評論 2 370

推薦閱讀更多精彩內容