第三章 Android 基本元件

變數命名規則

不論是那一門科目, 只要跟電腦有關, 就是要再重新的說明一次如何命名變數, 甚至是檔案

1. 使用匈牙利命名法 : 首字小寫, 第二個單字(含)後, 首字大寫, 如  thisIsABook
2. 變數中間不可以有+-*/$#@等特殊符號, 空格也不行
3. 首字不可以為數字 : 如 2score 絕對禁止的
4. 首字可以為底線 : 如 _score, 但不建議. 因為在其他應用上, 是屬於系統級變數
5. 類別變數, 首字大寫 : 如 public class HelloTest

基本元件(Widget)

話說寫Android 程式有蠻長的一段時間了, 但為了組織上課的教學大綱而重新整理這些資料時, 發現了一件事情, 每本書, 每個網站, 都會使用元件(Widget)這個術語. 感覺這真的是來亂的, 因為元件, 其實就是指Java觀念中, 由類別所產生出來的物件嘛!!

Android 提供一些基本元件(Widget), 讓開發人員依需求組合這些元件而形成應用程式. 常用的基本元件如下

Activity : 活動元件. 為最基本的元件, 繼承了Activity類別, 再搭配XML畫面配置檔, 提供操作的功能及顯示資料的畫面.
AppWidget : 小工具元件. 可以安裝在桌面的特殊元件. 如時鐘, 日曆等
Service : 服務元件. 提供在背景運作的功能
BroadcastReciver : 廣播元件. 也是在背景運作, 可接收系統特定事件. 比如來電通知, Wifi開啟等訊息

Activity

活動元件也就是使用者所看到的操作畫面元件. 比如有四個操作畫面要切換, 就會有四個活動元件. 活動元件繼承了android.app.Activity類別. 活動元件在使用者啟動後, 就開始執行並消耗CPU資源. 而結束後就立即停止運作。
下面程式碼中的AppCompactActivity為Activity的子類別元件

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

在活動元件裏, 又會包含著其他的元件, 比如文字元件, 按鈕元件. 這些元件的位置怖局, 通常會寫在XML裏, 方便日後的管理及維護.
下面的XML可以在 res/layout/activity_main.xml找到

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
    android:layout_height="match_parent" android:fitsSystemWindows="true"
    tools:context=".MainActivity">

    <android.support.design.widget.AppBarLayout android:layout_height="wrap_content"
        android:layout_width="match_parent" android:theme="@style/AppTheme.AppBarOverlay">

        <android.support.v7.widget.Toolbar android:id="@+id/toolbar"
            android:layout_width="match_parent" android:layout_height="?attr/actionBarSize"
            android:background="?attr/colorPrimary" app:popupTheme="@style/AppTheme.PopupOverlay" />

    </android.support.design.widget.AppBarLayout>

    <include layout="@layout/content_main" />

    <android.support.design.widget.FloatingActionButton android:id="@+id/fab"
        android:layout_width="wrap_content" android:layout_height="wrap_content"
        android:layout_gravity="bottom|end" android:layout_margin="@dimen/fab_margin"
        android:src="@android:drawable/ic_dialog_email" />

</android.support.design.widget.CoordinatorLayout>

小工具元件

小工具元件可以在桌面動態顯示結果, 而且是不需要使用者啟動, 當開機完成後就會自動執行的元件. 比如桌面的時鐘, 其時針會一直變化, 天氣的Widget也會持續的更新. 這種在桌面上顯示的小工具, 可長按桌面後, 再選擇小工具, 把想要的工具直接拉到桌面上.

小工具元件繼承了android.appwidget.AppWidgetProvider, 有時也需搭配XML配置其UI介面

服務元件(Service Widget)

服務元件也是在背景執行的, 通常不會有操作的介面. 比如要花很長的時間去讀取eMMc的檔案, 或持續接收網路上的資料, 就需使用服務元件. 等到資料完成收集後, 再通知其他應用程式顯示或處理.

Android規定, 要花很長時間(5秒以上)來處理的事情, 就要交給服務元件. 如果把這種要花長時間的任務交給Activity, 就會出現ANR的錯誤(Application Not Responding)

服務元件繼承了android.app.Service類別, 可以由應用程式來啟動或執行.

廣播接收元件(BroadcastReceiver)

服務元件完成資料收集後, 如何通知應用程式呢? 就是透過這個元件來通知的. 當服務元件完成任務, 就發送廣播元件, 讓需要的應用程式接收到此訊息, 再展開後續的處理.

廣播接收元件不一定是由服務元件來發送, 系統也會發送, 比如電池快沒電了, 就會發送低電量廣播元件. 有人打電話進來了, 系統就會發送來電通知的廣播.

而接收廣播訊息的應用程式, 不一定只有一支應用程式. 比如有來電通知後, 可以用一般的電話程式接收, 也可以用XOne接收, 有的人還可以用Skype接收. 這三支程式都會收到廣播. 那到底是誰要處理來電訊號呢? 此時系統又會彈出視窗, 問你要用那一支程式來接聽電話

Android應用程式架構

Android現在愈來愈強大, 除了可以應用在手機平板電腦之外, 也可以應用在穿載式裝置(Smart watch, 手環)及智慧型電視上. 這種包山包海的東西, 對我們這些程式開發者(以後簡稱RD-Research and Develop) 是訐譙的要死.

開發一個專案需開啟一個Project, 而這個專案中需適用不同的裝置則是開啟不同的Module來進行開發. 比如開發一個Pokemon project, 然後需分成三個Module
1. mobile module(手機平板專用)
2. wear module(穿載式專用)
3. tv module(電視專用)

當開發這三個module時, 在Android Studio左邊的目錄結構就會出現 mobile, wear, tv三個資料夾. 但如果只有手機module時, 就只會出現app這個資料夾(又讓人抓狂了, 為什麼不直接用使用mobile呢)

 Gradle Script

gradle這個字在字典裏查不到, 這個叫建置. 每個專案有一個建置檔, 每個Module也有自己的建置檔. 而且都統一命名為build.gradle. 是自動化編譯時的script語言, 就像是C語言的Makefile, 規定要怎麼編譯啦, 要加什麼lib啦, 要產生 .exe 或 .dll 或 .so 或 .a之類的

通常build.gradle(Project)都不需要修改, 也不建議手動修改. 但build.gradle(Module)就有可能會手動修改了, 而且修改後, 記得要執行tools/Android/Sync project with gradle Files, 這樣才會將整個專案進行同步更改

在build.gradle中, 有幾項設定需稍微注意一下
compileSdkVerson : 設定要使用那一個版本的API來進行編譯器, 通常是選最新的API
minSdkVersion : 可以安裝及執行的最低裝置版本, 比如設API level8, 那就表示這支程式不能安裝於Android 2.2以下
targetSdkVersion : 決定安裝及執行的最主要目的裝置版本, 通常也都設為最新的API

AndroidManifest.xml

每一個Module(應用程式), 都有一個設定檔, 叫AndroidManifest.xml. 此檔案設定了程式的名稱, 圖示為何, 第一支啟動程式為那一支等等

如下所示, 幾個重要的項目要記一下
最外圈為<manifest>…</manifest> 包含了故定不變的xmlns, 及設定package 的目錄
<application>…</application> 設定了應用程式的資訊等. 而應用程式包含的元件(如活動元件, 服務元件)必需放在這裏面
<activity>…</activity> 為活動元件的資訊
<service>…</service> 為服務元件的資訊

日後還會說明如何禁止螢幕旋轉, 啟動permission, 也都在這裏設定

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.asuscomm.mahaljsp.hellotest" >
    <uses-permission android:name="android.permission.INTERNET"/> 允許此app可以使用internet
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher" App的Icon
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme" >
        <activity
            android:screenOrientation="portrait" 螢幕直向,禁止旋轉
            android:name=".MainActivity"
            android:label="@string/app_name"
            android:theme="@style/AppTheme.NoActionBar" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" /> 最先執行的Activity
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>

資源與程式碼

在Android Studio左邊的目錄中, 有app的目錄, 裏頭有manifest, java, res三個子目錄. manifest為上述所說的設定檔, 而java裏頭存放的就是我們所撰寫的java原始碼.

android_package

在java目錄下, 又有三個package, 其中二個後面有加(AndroidTest)及(Test)是測試時所需要的程式碼, 不可以變更. 

在開新專案時, 我的company domain明明是打mahaljsp.asuscomm.com啊, 為什麼上面的package是倒著寫呢? 因為在網路上解析網址時, 是先去抓取最後面的DNS來進行ip轉譯, 再逐一往前找剩下的DNS. 比如 www.google.com.tw, 是先找tw的DNS, 再找com的DNS, 然後再找google的DNS. 因此這個package name就會倒過來寫

最後res裏放的是資源檔, 比如程式所需用到的圖片, 就會放在這裏, 然後隨著打包程式一起被包進apk裏. 另外多國語系的字串也是放在這裏的. 而最重要的畫面設定檔(UI), 則是放在res/layout之下

特別注意一下, 雖說UI可以用視覺化的方式直接拖進來拉出去的, 對於初學者好像是一個很友善的操作. 其實大錯特錯了. 拉來拉去的, 是拉不出好效果的, 這只是給幼稚園的小朋友玩的, 所以別太依賴這種功能, 還是要進入文字模式一個一個調整才是王道‧

 撰寫程式碼

在撰寫Java程式碼, 若是使用到了舊版的API, 而此API會因效能等因素而出現不建議使用的字眼-deprecated, 並會在上面自動加上刪除線.

此時還是可以執行, 只是建議換上新版的API. 而其相關的資訊可按Ctrl+Q顯示

快速鍵

在撰寫Java程式碼時, 可以使用常用的快速鍵幫助編輯
Alt+enter : 快速修正問題
Ctrl+Q : 顯示deprecated訊息
Ctrl+O : 顯示可複寫的方法(Override)
Ctrl+/ : 在選取的文字前面加上單行註解 //
Ctrl+Shift+/ : 在選取的文字前後加上多行註解 /*  */

發佈留言