進階應用程式設計 2014/12/21
Post on 25-Jul-2015
190 Views
Preview:
TRANSCRIPT
進階程式設計⺩王哲輝
在開始之前
Android Studio 1.0 發佈了
⾄至於那個棄嬰...
7⽉月開始看起來就沒什麼在維護
專案範本好像也壞掉了
Android 程式設計
Android 程式設計
總之先建個專案吧
https://github.com/freesamael/npu-java-course-2014-fall/
匯⼊入專案
執⾏行專案
或⽤用 Android Studio 匯⼊入專案
執⾏行專案
專案結構⽐比較
專案結構⽐比較
專案結構⽐比較
manifest n. 載貨單, 運貨單, 旅客名單系統藉由讀取 manifest 檔案註冊 app 元件
專案結構⽐比較
專案結構⽐比較
java 原始碼檔案
專案結構⽐比較
專案結構⽐比較
資源檔 (字串、佈景、⾵風格、圖⽚片、動畫,...)
專案結構⽐比較
專案結構⽐比較
編譯設定 (Gradle vs. Ant)
Android App 組成
Android App 組成
Activity使⽤用者介⾯面
Android App 組成
Activity
Service
使⽤用者介⾯面
背景服務
Android App 組成
Activity
Service
Broadcast Receiver
使⽤用者介⾯面
背景服務
接收廣播通知
Android App 組成
Activity
Service
Broadcast Receiver
Content Provider
使⽤用者介⾯面
背景服務
接收廣播通知
內容提供
Android App 組成
Activity
Service
Broadcast Receiver
Content Provider
使⽤用者介⾯面
背景服務
接收廣播通知
內容提供
Activity
認識 App Manifest
http://developer.android.com/guide/topics/manifest/manifest-intro.html#filestruct
認識 Intent
認識 Intent
activity n. 活動, ⾏行動, 活躍, 活⼒力
認識 Intent
intent n. 意圖, 含義, 故意
activity n. 活動, ⾏行動, 活躍, 活⼒力
認識 Intent
intent n. 意圖, 含義, 故意
activity n. 活動, ⾏行動, 活躍, 活⼒力
“執⾏行特定活動,以讓使⽤用者完成特定意圖”
例:執⾏行⼀一個活動,讓使⽤用者得以觀看資管系網⾴頁
例:執⾏行⼀一個活動,讓使⽤用者得以觀看資管系網⾴頁
⺫⽬目的: 動作 (action) = 觀看 網址 (data_uri) = http://mis.npu.edu.tw
例:執⾏行⼀一個活動,讓使⽤用者得以觀看資管系網⾴頁
⺫⽬目的: 動作 (action) = 觀看 網址 (data_uri) = http://mis.npu.edu.tw
adb shell am start -a "android.intent.action.VIEW" -d "http://mis.npu.edu.tw"
斯斯有三種,Intent 分兩種
斯斯有三種,Intent 分兩種隱含意圖 (implicit intent): 不指定完成 intent 的程式或元件
斯斯有三種,Intent 分兩種隱含意圖 (implicit intent): 不指定完成 intent 的程式或元件
明確意圖 (explicit intent): 指定完成 intent 的程式或元件
斯斯有三種,Intent 分兩種隱含意圖 (implicit intent): 不指定完成 intent 的程式或元件
明確意圖 (explicit intent): 指定完成 intent 的程式或元件
adb shell am start -a "android.intent.action.VIEW" -d "http://mis.npu.edu.tw"
斯斯有三種,Intent 分兩種隱含意圖 (implicit intent): 不指定完成 intent 的程式或元件
明確意圖 (explicit intent): 指定完成 intent 的程式或元件
adb shell am start -a "android.intent.action.VIEW" -d "http://mis.npu.edu.tw"
adb shell am start -a "android.intent.action.VIEW" -d "http://mis.npu.edu.tw" com.android.browser
z
z
敘述意圖過濾器 (intent filter)
z
敘述意圖過濾器 (intent filter)
透過意圖匹配 (intent matching) 找到適當程式元件
Activity ⽣生命週期
任務(Task)與 返回堆疊(Back Stack)
Application ⽣生命週期 != Activity ⽣生命週期
Application ⽣生命週期 != Activity ⽣生命週期
但是有相關的
最常⾒見的⾃自動結束時機
⾃自動結束:OOM Killer
Android 系統在記憶體不⾜足的時候, 會由 OOM (out-of-memory) killer 結束 oom_adj 值較⼤大的程序。
http://developer.android.com/guide/components/processes-and-threads.html
⼿手動結束:Task Killer⼿手動滑開的時候:
Task 中的所有 Activity 會被結束, 如果某程序已經沒有其他正在執⾏行的元件,該程序會被結束。
⼿手動結束:Task Killer⼿手動滑開的時候:
Task 中的所有 Activity 會被結束, 如果某程序已經沒有其他正在執⾏行的元件,該程序會被結束。
也就是說,滑掉不保證⼀一定會導致程序結束;沒滑掉的也不⾒見得還在執⾏行。
⼿手動結束:Task Killer⼿手動滑開的時候:
Task 中的所有 Activity 會被結束, 如果某程序已經沒有其他正在執⾏行的元件,該程序會被結束。
也就是說,滑掉不保證⼀一定會導致程序結束;沒滑掉的也不⾒見得還在執⾏行。
所以它叫 recent apps,不稱為 running apps。
認識資源檔MyProject/ src/ MyActivity.java res/ layout/ main.xml info.xml layout-land/ main.xml info.xml
在 Android 上,可以針對不同的裝置,提供不同的 佈局、圖⽚片、字串、動畫、⾵風格等各種資源,藉以 呈現不同的 UI。
http://developer.android.com/guide/topics/resources/providing-resources.html
在程式碼中使⽤用資源
資源檔在 Android 編譯流程中會產⽣生成 R.java
圖形使⽤用者介⾯面
視窗 (Window) 圖形使⽤用者介⾯面的基礎
Macintosh (1984)
視窗內容 (Window Content): 完全由開發者⾃自⾏行設計的內容介⾯面
視窗裝飾 (Window Decoration): 由視窗管理員繪製的介⾯面,提供諸如 標題列、最⼤大化、最⼩小化、關閉、狀態列、⼤大⼩小調整等功能
Android 也有視窗嗎?
視窗內容
瀏覽列 (navigation bar)
狀態列 (status bar)動作列 (action bar)
控制項 (Widget / Control / Component / View)
常⾒見的佈局 (Layout)⽔水平
垂 直
格狀
控制項/佈局階層
Hierarchy Viewer (Demo)
Lab 1 - 佈局練習
試做出如左圖形式之佈局, 不需實作功能。
事件傳遞
Button.onTouchEvent() 該如何實作?
事件傳遞
public void onTouchEvent() {mCalculator.onClick();
}
事件傳遞
public void onTouchEvent() {mCalculator.onClick();
}
如何設定 mCalculator?
事件傳遞
public void onTouchEvent() {mCalculator.onClick();
}
如何設定 mCalculator?
如何⽀支援 Calculator 以外的型別?
事件傳遞
public void onTouchEvent() {mCalculator.onClick();
}
如何設定 mCalculator?
如何⽀支援 Calculator 以外的型別?
觀察者模式 (Observer Pattern)
觀察者模式
觀察者模式Button
觀察者模式ButtonOnClickListener
觀察者模式ButtonOnClickListener
MyOnClickListener
public class MyOnClickListener implements OnClickListener {public void onClick(View v) {
...}
}
實作觀察者
public class MyOnClickListener implements OnClickListener {public void onClick(View v) {
...}
}
實作觀察者
button.setOnClickListener(new MyOnClickListener());註冊觀察者
public class MyOnClickListener implements OnClickListener {public void onClick(View v) {
...}
}
實作觀察者
button.setOnClickListener(new MyOnClickListener());註冊觀察者
public boolean onTouchEvent(MotionEvent event) {if (...) {
for (OnClickListener listener : mListeners) {listener.onClick(this);
}return true;
}return false;
}
通知觀察者 (在 Framework 內)
接收點擊事件
+
或者
Lab 2 - 點擊事件
實作主要功能
Lenna ⼜又來了
loadLennaV1
Lenna ⼜又來了
loadLennaV1
Lenna ⼜又來了
loadLennaV1
loadLennaV2
Lenna ⼜又來了
loadLennaV1
loadLennaV2
Lenna ⼜又來了
loadLennaV1
loadLennaV2
loadLennaV3
Lenna ⼜又來了
loadLennaV1
loadLennaV2
loadLennaV3
Lenna ⼜又來了
loadLennaV1
loadLennaV2
loadLennaV3
loadLennaV4
AsyncTask
在背景執⾏行緒執⾏行 耗時間的任務,再適當 透過主執⾏行緒更新 UI
這圖⼀一看就知道⼤大陸網站偷來的...
Lab 3 - BMI 計算器實作⼀一 App,讓使⽤用者輸⼊入⾝身⾼高、體重,算出其 BMI。
實作⼀一 App,讓使⽤用者輸⼊入⾝身⾼高、體重,算出其 BMI。
Lab 3 - 沒品 BMI 計算器
實作⼀一 App,讓使⽤用者輸⼊入⾝身⾼高、體重,算出其 BMI。
Lab 3 - 沒品 BMI 計算器
• 若 BMI < 18.5,在畫⾯面上顯⽰示⼀一隻猴⼦子的圖⽚片,並⽤用 Toast 秀出「死猴⼦子,你太瘦了!」
實作⼀一 App,讓使⽤用者輸⼊入⾝身⾼高、體重,算出其 BMI。
Lab 3 - 沒品 BMI 計算器
• 若 BMI < 18.5,在畫⾯面上顯⽰示⼀一隻猴⼦子的圖⽚片,並⽤用 Toast 秀出「死猴⼦子,你太瘦了!」
• 若 BMI > 24,在畫⾯面上顯⽰示⼀一隻豬的圖⽚片,並⽤用 Toast 秀出「⼋八戒,該減肥了!」
實作⼀一 App,讓使⽤用者輸⼊入⾝身⾼高、體重,算出其 BMI。
Lab 3 - 沒品 BMI 計算器
• 若 BMI 介於兩者之間,在畫⾯面上顯⽰示⼀一隻河童的圖⽚片,並⽤用 Toast 秀出「不是猴⼦子不是豬,你沙悟淨唷!」
• 若 BMI < 18.5,在畫⾯面上顯⽰示⼀一隻猴⼦子的圖⽚片,並⽤用 Toast 秀出「死猴⼦子,你太瘦了!」
• 若 BMI > 24,在畫⾯面上顯⽰示⼀一隻豬的圖⽚片,並⽤用 Toast 秀出「⼋八戒,該減肥了!」
期末專案
⾃自由發揮準備單⾴頁簡報: 1. App 簡介 2. 組員名單及負責的功能
top related