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 )。我們來看看圖:- Vehicle: 你的車車
- OBDII: 你的連接器 (dongle)? wifi or bluetooth (自己製作或是買現成的,隨你高興)
- CellPhone: 你的手機,iPhone or Android (掌控權在你手上,呼叫救援/傳送資料你決定)
- Cloud: 資料送雲端 (有憑有據,資料不遺失)
- Service: 你的維修車廠 (Service Center / Help Center)
手機系統分析
圖檔有點大,阿貝只是介紹我使用的工具,因為阿貝 只有4GRAM,只有4GRAM,只有4GRAM,因為機器老舊所以最大 只有4GRAM,很重要,所以講 4 遍,也只好裝 Linux ubuntu,當然有時候還是會開 Android Studio 來檢查程式。
我們先看看左半邊,幾乎所有的目錄結構都有了。也就是說我們先分好各結構。
- Config: 每個程式當然要有給 user 基本的選單,講到這個就呼應前面所講的 Android 要求開發人員盡量不要在用 preferenceActivity,要改用 PreferenceFragment,你知道嗎?真的為了所謂的 Model-View-Control (MVC) 越乾淨越好,讓阿貝想了好久的才解決,這應該不是OO的精神吧? 我們現代人講中文也會夾雜著一些外來語,不就是這樣嗎?
- Connecting: 當然是我們的 device interface,就是 bluetooth & wifi 程式。
- Obd: 就是一些Obd的指令,包含 AT 指令 及 PID 數字指令,這些指令就是用來跟連接器做溝通用。
- utils: 就一些小雜項 class,看檔名也知道啦。
- Views: 主程式群,遵循 Android 的 UI 設定,螢幕顯示啦。
好啦,那主程式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
}
留言
張貼留言