iT邦幫忙

DAY 11
1

Android 實現智慧生活 DIY系列 第 11

實現智慧家庭diy (Day11) - 從 Android 輸入法框架, 學習設計Android 框架 API

為何強調 框架 API ? 因為 微軟 谷歌皆為它們的系統平台,提供開發應用程式所用的程式框架(通稱 API), Windows是 .Net framework, Android 即是Android Application Framework.

高煥堂老師 如此形容 :
框架Api是引誘APP開發者的魚餌,框架是則魚鉤。
魚鉤與魚餌,APP開發者就是魚。這是以軟體架構設計,展現商業力量的絕佳示範。

我今天就來以輸入法為例,剖析其中道理。

所有文章
http://ithelp.ithome.com.tw/category/家庭雲
眾所周知的 輸入法系統服務是 :
系統接收來自 Input device的 Event, 這輸入事件依序存入佇列,
系統會經常來佇列取出事件,判定該交由那個程式處理。
調用該程式處理輸入事件。

Android 輸入法輸入法框架在幫我們作什麼,在此以觸控面板舉例如下圖:

Android 系統接收 觸控面板的 Event, 包含 座標 ,手指滑動距離,及時間長度。
先對此事件做初步處理, 後續處裡會交由輸入法APP執行,輸入法APP將此事件 經運算後得知, 目前畫面的圖,需向右移動 50 ,接著通知 系統畫面需 reDraw,系統會決定何時reDraw, 那時會再調用系統繪圖程式。

由此看出,Android與輸入法APP兩者間如何接力完成工作。你也該從圖中看出 Android 框架掌握主導權,它需要 輸入法 APP協助時, 會傳遞必要資訊並呼叫 輸入法APP。

請看下圖以在注音輸入模式,使用者若按 'D', 會如何 ?

我們來看程式如何運作,

當輸入法框架取得按壓訊息後,會根據輸入法 APP定義的虛擬鍵盤的 Layout, 找到對應的 Keycode , 用這 Keycode 當參數,呼叫 輸入法 APP的 onKey(Keycode, keyEvent)函式, 輸入法APP的 onKey()函式就得處裡框架送來的按鍵碼. 這onKey()會將Keycode轉成注音符號 ㄎ,再送出。這OnKey()便是大家熟知的 event Handler method.

這onKey 高煥堂老師稱它為卡榫函式, 它的作用是 Android 輸入法框架比輸入法APP還早被設計,Android 輸入法框架API 設計 一個onKey()這個抽象函式, 輸入法APP為了要能捕獲 Android 輸入法框架送出的訊息,必須要實作 onKeyActionListener(這裡也規定了onKey()) 這個 Interface, 如此 輸入法APP 就能以這onKey()與Android 輸入法框架 接合,因而稱 onKey() 卡榫函式。
下圖是強調 onKey() 是Android 框架訂的規範, 輸入法APP必須依循.更重要的是, onKey()是Android 框架下命令給輸入法 APP。所以, 框架 API是具有主導權的API。 Google就是用這招 綁住所有的 APP。綁住的意思是,APP改版時機是由google 決定。

我們的理念著重軟硬整合設計,在此我也示範其設計手法如下。
上面第三圖,若觸控晶片廠新加指紋偵測於此觸控元件,驅動程式也加此功能,可惜Android的API並未支援,那豈不枉費新功能。

請看下圖解法, 我們可保留原來的API以相容舊版,另行擴充一個包含onFingerPrint()函式,來處裡指紋訊息。我們用圖中新的API接口(myAndroidAPI)替換原來的AndroidAPI接口,如此我們的系統就支援新的觸控事件(原來的按壓加指紋偵測事件),特別提醒,使用舊版API的 輸入法APP,他仍使用原來的AndroidAPI, 而新版的輸入法APP 則採用新的 myAndroidAPI, 我們的系統就能增加指紋偵測囉。


上一篇
實現智慧家庭diy (Day10) - 智慧輸入法的商業價值
下一篇
實現智慧家庭diy (Day12) - 為何寫Android APP 不能用 new 來建立 Activity。
系列文
Android 實現智慧生活 DIY30

2 則留言

0
timloo
iT邦研究生 2 級 ‧ 2012-10-07 01:24:00

patrickcheng提到:
我們的系統就能增加指紋偵測囉。

竟然是指紋偵測,

真的沒想到,輸入法框架拿來做身分驗証。

好酷。

若結合您用組合語言寫的硬體控制程序,更棒。

0
timloo
iT邦研究生 2 級 ‧ 2012-10-08 09:27:09

patrickcheng提到:
下圖是強調 onKey() 是Android 框架訂的規範, 輸入法APP必須依循.更重要的是, onKey()是Android 框架下命令給輸入法 APP。所以, 框架 API是具有主導權的API。 Google就是用這招 綁住所有的 APP。綁住的意思是,APP改版時機是由g...(恕刪)

回來用力看卡榫函式時,才發現這段值得品味的段落。

卡榫在現實生活中,不太常用,反而讓我很困惑,是木工用語嗎?

是的中式、日式古老建築經常可見,稱為卡榫,取其形,一邊是虛(在框架父類的抽象函式),一邊為實(APP 端的子類需撰寫期內涵),所謂虛實相依是也。虛實如何配合運作,近日另撰文剖析。
謝謝您的回應。

我要留言

立即登入留言