Android 設計-1

開始學習 Android

大家好,好久不見了,這幾個月在寫 Android 藍牙 OBD的手機程式。 過幾天有空我會 PO 上 Github ,現在開始解釋一些 Android 上寫程式的經驗給大家參考參考。
謎之音,到底寫 iPhone 程式好,還是寫 Android 程式好? 會有這種問題,應該問問你自己,你到底要做什麼? 這個問題,就讓你的小腦袋瓜自己想想?
就好像有人問我 javascript? Angular? Node.JS? React? Vue.JS? 你說呢?
開歐系車好?還是日系車?
應該問問你自己吧!

高手如雲

花了快6個月的時間研究 Android 到底怎麼寫,還真的滿辛苦的,因為 Android一直在改變,一下子 函數 deprecated。首先 Java Object-Oriented (Java OO) 的概念一定要熟,物件導向技術主要包含封裝、繼承與多型三大基本觀念。在我未來舉的例子裡會包含。不用擔心,但是大家還是要了解它的用法,Android API 設計團隊高手如雲,SDK的封裝性,越升級越緊湊,現在甚至要求 盡量 多用 Fragment,少用 Activity,搞得好多人喊 不要不要。 好吧,廢話少說,就照他的意思吧。

系統架構

之前阿貝講過,你沒有先計畫好架構,就努力埋頭去寫,這樣會導致很多的白工。首先,我們應該先計畫好我們的目標,如同先前我寫的、PM 要的是什麼? IoT (Internet of Things),車用 (Vehicle IoT system )。我們來看看圖:
m1
  • Vehicle: 你的車車
  • OBDII: 你的連接器 (dongle)? wifi or bluetooth (自己製作或是買現成的,隨你高興)
  • CellPhone: 你的手機,iPhone or Android (掌控權在你手上,呼叫救援/傳送資料你決定)
  • Cloud: 資料送雲端 (有憑有據,資料不遺失)
  • Service: 你的維修車廠 (Service Center / Help Center)
OK,這樣就完成了一個大架構的需求,當然,我們必須先從小地方開始做起,那就先寫手機程式吧。

手機系統分析

p1
圖檔有點大,阿貝只是介紹我使用的工具,因為阿貝 只有4GRAM,只有4GRAM,只有4GRAM,因為機器老舊所以最大 只有4GRAM,很重要,所以講 4 遍,也只好裝 Linux ubuntu,當然有時候還是會開 Android Studio 來檢查程式。
我們先看看左半邊,幾乎所有的目錄結構都有了。也就是說我們先分好各結構。
  • Config: 每個程式當然要有給 user 基本的選單,講到這個就呼應前面所講的 Android 要求開發人員盡量不要在用 preferenceActivity,要改用 PreferenceFragment,你知道嗎?真的為了所謂的 Model-View-Control (MVC) 越乾淨越好,讓阿貝想了好久的才解決,這應該不是OO的精神吧? 我們現代人講中文也會夾雜著一些外來語,不就是這樣嗎?
p2
  • Connecting: 當然是我們的 device interface,就是 bluetooth & wifi 程式。
  • Obd: 就是一些Obd的指令,包含 AT 指令 及 PID 數字指令,這些指令就是用來跟連接器做溝通用。
  • utils: 就一些小雜項 class,看檔名也知道啦。
  • Views: 主程式群,遵循 Android 的 UI 設定,螢幕顯示啦。
p3
好啦,那主程式Activity長的怎樣?就這樣,這讓我想到以前寫 C 語言的感覺, main(){ ... } 就沒了。阿貝沒有用,Android提供的LOG,我借用 slf4j 的Log,沒什麼,就好用而已,表揚一下。
package com.motor.sentinel;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class MainActivity extends AppCompatActivity {

  private static final Logger LOG = LoggerFactory.getLogger(MainActivity.class.getSimpleName());

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    LOG.debug("Log from {} onCreate {}", this, savedInstanceState);

    // MainFragment fragment;
    if (savedInstanceState==null) {
      getFragmentManager().beginTransaction()
        .replace(R.id.ContainerLayout, new MainFragment()).commit();
    }
  }  // onCreate
}

留言

這個網誌中的熱門文章

CRV 變速箱油-煞車油-濾芯-中型保養(二)

機車頭燈自動開關裝置

迅光化油器調整