SlideShare a Scribd company logo
炎炎夏⽇日學 Android
Johnny Sung
Part3: Android app 實作
Mobile device developer
Johnny Sung
https://fb.com/j796160836
https://blog.jks.coffee/
https://www.slideshare.net/j796160836
https://github.com/j796160836
⼩小試⾝身⼿手 😊
震動。
震動
<uses-permission android:name="android.permission.VIBRATE" />
val vibrator = getSystemService(Context.VIBRATOR_SERVICE) as Vibrator
vibrator.vibrate(10)
AndroidManifest.xml
震動
vibrator.vibrate(longArrayOf(80, 150, 80, 150, 80, 150), -1)
vibrator.cancel()
炎炎夏日學 Android 課程 - Part3: Android app 實作
休息⼀一下 ☕
軟體設計
• 企劃

• UI/UX 介⾯面設計(美術)

• 程式

• 測試
所需材料
• 畫⾯面線框稿 (Wireframe)

• API 接⼝口⽂文件

• 美術圖片
成功畫⾯面 載入中畫⾯面 錯誤畫⾯面
成功畫⾯面 載入中畫⾯面 錯誤畫⾯面
夕陽⼩小幫⼿手
成功畫⾯面 載入中畫⾯面 錯誤畫⾯面
夕陽⼩小幫⼿手
所需⼯工具
• Method Draw 線上編輯圖片⼯工具

https://editor.method.ac/

• App Icon Generator 線上 App icon 產⽣生⼯工具

https://appicon.co/

• JSON Editor Online 線上 JSON 編輯⼯工具

https://jsoneditoronline.org/
炎炎夏日學 Android 課程 - Part3: Android app 實作
炎炎夏日學 Android 課程 - Part3: Android app 實作
https://sunrise-sunset.org/api
22.604098, 120.3001811
K Square
經度 (Latitude) 緯度 (Longitude)
地址:806⾼高雄市前鎮區復興四路路 20 號
座標
炎炎夏日學 Android 課程 - Part3: Android app 實作
炎炎夏日學 Android 課程 - Part3: Android app 實作
炎炎夏日學 Android 課程 - Part3: Android app 實作
https://api.sunrise-sunset.org/json?lat=22.604098&lng=120.3001811&date=today&formatted=0
今⽇日 K Square 夕陽時間
炎炎夏日學 Android 課程 - Part3: Android app 實作
炎炎夏日學 Android 課程 - Part3: Android app 實作
夕陽⼩小幫⼿手 使⽤用套件
• Gson 解析 JSON 資料

• OkHttp 網路路函式庫

• jDeferred 架構函式庫
dependencies {
// ...
implementation 'org.immutables:gson:2.7.1'
implementation 'com.squareup.okhttp3:okhttp:3.12.0'
implementation "org.jdeferred.v2:jdeferred-core:2.0.0-beta1"
implementation "org.jdeferred.v2:jdeferred-android:2.0.0-beta1"
// ...
}
加入套件參參考
炎炎夏日學 Android 課程 - Part3: Android app 實作
炎炎夏日學 Android 課程 - Part3: Android app 實作
炎炎夏日學 Android 課程 - Part3: Android app 實作
炎炎夏日學 Android 課程 - Part3: Android app 實作
class SunsetResponse {
var results: SunsetResult? = null
var status: String? = null
}
class SunsetResult {
var sunset: String? = null
}
單元測試原則
• Arrange – 準備,準備輸入資料與期待值

• Act – 執⾏行行,執⾏行行測試對象

• Assert – 驗證,驗證結果
3A 原則
class ExampleUnitTest {
@Test
fun addition_isCorrect() {
// Arrange
val expected = 4
// Act
val actual = 2 + 2
// Assert
assertEquals(expected, actual)
}
}
Arrange 準備
Act 執⾏行行
Aessrt 驗證
object SunsetDateUtil {
val dateFormater = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssX", Locale.US)
.apply {
timeZone = TimeZone.getTimeZone("UTC")
}
}
Arrange 準備
Act 執⾏行行
Aessrt 驗證
@Test
fun testJSON() {
// Arrange
val json =
"{"results":{"sunrise":"2019-06-28T21:17:03+00:00","sunset":"2019-06-29T10:47:28+00:00","solar_noon":
"2019-06-29T04:02:16+00:00","day_length":48625,"civil_twilight_begin":"2019-06-28T20:52:00+00:00","civil_twilight_end":
"2019-06-29T11:12:31+00:00","nautical_twilight_begin":"2019-06-28T20:22:00+00:00","nautical_twilight_end":
"2019-06-29T11:42:31+00:00","astronomical_twilight_begin":"2019-06-28T19:50:46+00:00","astronomical_twilight_end":
"2019-06-29T12:13:46+00:00"},"status":"OK"}"
val excepted = "2019-06-29T10:47:28+00:00"
// Act
val gson = Gson()
val obj = gson.fromJson(json, SunsetResponse::class.java)
// Assert
Assert.assertEquals(excepted, obj.results?.sunset)
}
}
Arrange 準備
Act 執⾏行行
Aessrt 驗證
輸入的資料
期待成功的資料
class SunsetUnitTest {
@Test
fun testFormatter() {
val sunsetTime = "2019-06-24T10:46:49+00:00"
val expected = Date(1561373209000)
val result = SunsetDateUtil.dateFormater.parse(sunsetTime)
assertEquals(expected.time, result.time)
}
}
class NetworkManager {
companion object {
val instance: NetworkManager by lazy {
NetworkManager()
}
}
val mainHandler = Handler(Looper.getMainLooper())
inline fun <reified T> requestAsync(request: Request, typeToken: Type): Promise<T, Exception, Double> {
val okHttpClient = OkHttpClient()
val gson = GsonBuilder().create()
val deferred = DeferredObject<T, Exception, Double>()
okHttpClient.newCall(request).promise().then { okhttpResponse ->
val strResult = okhttpResponse.body()?.string()
try {
val result = gson.fromJson<T>(strResult, typeToken)
if (okhttpResponse.isSuccessful) {
mainHandler.post {
deferred.resolve(result)
}
} else {
mainHandler.post {
deferred.reject(Exception(strResult))
}
}
} catch (e: Exception) {
mainHandler.post {
deferred.reject(e)
}
}
}.fail {
deferred.reject(it)
}
return deferred.promise()
}
}
fun Call.promise(): Promise<Response, Exception, Double> {
val deferred = DeferredObject<Response, Exception, Double>()
this.enqueue(object : Callback {
override fun onResponse(call: Call, response: Response) {
deferred.resolve(response)
}
override fun onFailure(call: Call, e: IOException) {
deferred.reject(e)
}
})
return deferred.promise()
}
補檔案 NetworkManager.kt
https://github.com/jdeferred/jdeferred
https://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html
object NetworkAPI {
fun getSunsetDataAsync(): Promise<SunsetResponse, Exception, Double> {
val okhttpRequest = Request.Builder()
.url("https://api.sunrise-sunset.org/json?lat=22.604098&lng=120.3001811&date=today&formatted=0")
.method("GET", null)
.build()
val type = object : TypeToken<SunsetResponse>() {}.type
return NetworkManager.instance.requestAsync(okhttpRequest, type)
}
}
https://square.github.io/okhttp/
炎炎夏日學 Android 課程 - Part3: Android app 實作
完成了了!🎉
Q & A
趕快去追夕陽吧 📷
炎炎夏日學 Android 課程 - Part3: Android app 實作

More Related Content

ODP
Backbone js
ZIP
Map Analytics - Ignite Spatial
PDF
Introduction to AngularJS
DOCX
DOCX
Negiotiable act
PDF
Engineering Portfolio
PPTX
Leap Motion Development (Rohan Puri)
PDF
How I failed to present on using DVCS to control archival metadata
Backbone js
Map Analytics - Ignite Spatial
Introduction to AngularJS
Negiotiable act
Engineering Portfolio
Leap Motion Development (Rohan Puri)
How I failed to present on using DVCS to control archival metadata

More from Johnny Sung (20)

PDF
用 Gemma 3, Gemma 3n 開放模型來解決企業難解的問題 @ COSCUP 2025
PDF
[GDG Build with AI] 善用現代 AI 科技:打造專屬行銷工具箱 @ GDG Changhua 彰化
PDF
地端自建 Kubernetes (K8s) 小宇宙 (On-premises Kubernetes) @ CNTUG 2024/11 Meetup #63
PDF
[AI LLM] Gemma 初體驗 @ GDG Cloud Taipei Meetup #70
PDF
Kubernetes 地端自建 v.s. GKE,哪個更適合你? @Devfest Taipei 2024
PDF
ArgoCD 的雷 碰過的人就知道 @TSMC IT Community Meetup #4
PDF
使用 Kong 與 GitOps 來管理您企業的 API 呼叫 @ 2024 台灣雲端大會
PDF
[AI / ML] 用 LLM (Large language model) 來整理您的知識庫 @Devfest Taipei 2023
PDF
[Flutter] Flutter Provider 看似簡單卻又不簡單的狀態管理工具 @ Devfest Kaohsiung 2023
PDF
[Golang] 以 Mobile App 工程師視角,帶你進入 Golang 的世界 (Introduction of GoLang)
PDF
[Flutter] 來體驗 bloc 小方塊的神奇魔法 @Devfest 2022
PDF
與 Sign in with Apple 的愛恨情仇 @ iPlayground2020
PDF
Flutter 是什麼?用 Flutter 會省到時間嗎? @ GDG Devfest2020
PDF
談談 Android constraint layout
PDF
炎炎夏日學 Android 課程 - Part1: Kotlin 語法介紹
PDF
炎炎夏日學 Android 課程 - Part2: Android 元件介紹
PDF
炎炎夏日學 Android 課程 - Part 0: 環境搭建
PPTX
About Mobile Accessibility
PDF
Introductions of Messaging bot 做聊天機器人
PDF
First meet with Android Auto
用 Gemma 3, Gemma 3n 開放模型來解決企業難解的問題 @ COSCUP 2025
[GDG Build with AI] 善用現代 AI 科技:打造專屬行銷工具箱 @ GDG Changhua 彰化
地端自建 Kubernetes (K8s) 小宇宙 (On-premises Kubernetes) @ CNTUG 2024/11 Meetup #63
[AI LLM] Gemma 初體驗 @ GDG Cloud Taipei Meetup #70
Kubernetes 地端自建 v.s. GKE,哪個更適合你? @Devfest Taipei 2024
ArgoCD 的雷 碰過的人就知道 @TSMC IT Community Meetup #4
使用 Kong 與 GitOps 來管理您企業的 API 呼叫 @ 2024 台灣雲端大會
[AI / ML] 用 LLM (Large language model) 來整理您的知識庫 @Devfest Taipei 2023
[Flutter] Flutter Provider 看似簡單卻又不簡單的狀態管理工具 @ Devfest Kaohsiung 2023
[Golang] 以 Mobile App 工程師視角,帶你進入 Golang 的世界 (Introduction of GoLang)
[Flutter] 來體驗 bloc 小方塊的神奇魔法 @Devfest 2022
與 Sign in with Apple 的愛恨情仇 @ iPlayground2020
Flutter 是什麼?用 Flutter 會省到時間嗎? @ GDG Devfest2020
談談 Android constraint layout
炎炎夏日學 Android 課程 - Part1: Kotlin 語法介紹
炎炎夏日學 Android 課程 - Part2: Android 元件介紹
炎炎夏日學 Android 課程 - Part 0: 環境搭建
About Mobile Accessibility
Introductions of Messaging bot 做聊天機器人
First meet with Android Auto
Ad

Recently uploaded (20)

PDF
cuic standard and advanced reporting.pdf
PPTX
Machine Learning_overview_presentation.pptx
DOCX
The AUB Centre for AI in Media Proposal.docx
PDF
TokAI - TikTok AI Agent : The First AI Application That Analyzes 10,000+ Vira...
PPTX
Big Data Technologies - Introduction.pptx
PDF
Approach and Philosophy of On baking technology
PPTX
ACSFv1EN-58255 AWS Academy Cloud Security Foundations.pptx
PDF
Per capita expenditure prediction using model stacking based on satellite ima...
PDF
NewMind AI Weekly Chronicles - August'25-Week II
PDF
Machine learning based COVID-19 study performance prediction
PPTX
Digital-Transformation-Roadmap-for-Companies.pptx
PDF
Building Integrated photovoltaic BIPV_UPV.pdf
PPTX
20250228 LYD VKU AI Blended-Learning.pptx
PPTX
Cloud computing and distributed systems.
PDF
Spectral efficient network and resource selection model in 5G networks
PDF
Peak of Data & AI Encore- AI for Metadata and Smarter Workflows
PDF
Network Security Unit 5.pdf for BCA BBA.
PDF
Agricultural_Statistics_at_a_Glance_2022_0.pdf
PDF
Encapsulation theory and applications.pdf
PPTX
Spectroscopy.pptx food analysis technology
cuic standard and advanced reporting.pdf
Machine Learning_overview_presentation.pptx
The AUB Centre for AI in Media Proposal.docx
TokAI - TikTok AI Agent : The First AI Application That Analyzes 10,000+ Vira...
Big Data Technologies - Introduction.pptx
Approach and Philosophy of On baking technology
ACSFv1EN-58255 AWS Academy Cloud Security Foundations.pptx
Per capita expenditure prediction using model stacking based on satellite ima...
NewMind AI Weekly Chronicles - August'25-Week II
Machine learning based COVID-19 study performance prediction
Digital-Transformation-Roadmap-for-Companies.pptx
Building Integrated photovoltaic BIPV_UPV.pdf
20250228 LYD VKU AI Blended-Learning.pptx
Cloud computing and distributed systems.
Spectral efficient network and resource selection model in 5G networks
Peak of Data & AI Encore- AI for Metadata and Smarter Workflows
Network Security Unit 5.pdf for BCA BBA.
Agricultural_Statistics_at_a_Glance_2022_0.pdf
Encapsulation theory and applications.pdf
Spectroscopy.pptx food analysis technology
Ad

炎炎夏日學 Android 課程 - Part3: Android app 實作