close
錯誤歸因

是一種人常犯的錯誤。

比如A事件和B事件同時發生造成了C結果,但當事者誤認C結果為A事件所造成,其實是B。

--

唉,

工作上我常出現這樣的問題 :(

該好好檢討,

所謂的鬼打牆,就是因為錯誤歸因先起了個頭,

而自己一開始完全搞懂,就會走到錯誤的路上。

--

由於在某個已確定的檔案裡面找不到,就覺得應該是發錯 KeyEvent

然後在自己覺得問題所在的地方放Log檢查

結果什麼都沒得到,

於是覺得是不同層級的問題,

應該不是framework 而是再往下

於是找阿找 去追可能的路徑

推測如下:

EventHub.cpp

負責設定property

KeyCharacterMap.cpp

來load *kcm

KeyCharacterMap.java

這裡負責來抓keycode 以建立keymap

(會先確認device -> 找keycode ->)

KeyEvent.java

根據keymap 發keyevent

--

總之,心裡就想,那我應該要

1. 幫寫一個kcm
2. 找keycode 定義
3. 幫他加一個對應event
4. 接著在policy定義要做的行為

--

但是,走了這一段路之後,

發現要找的東西,不在那個檔案,而是在隔壁 ....

唉 所以一步錯步步錯 @@

--

因為用grep找關鍵字

我先找到了 xxxManager.java

就覺得是這裡了!

疑 怎麼沒有 然後就以為少了什麼 該自己去補起來

但同一個目錄明明就還有 xxx.java

我卻見木不見林

@@



--

另一個觀察切入點

為甚麼要有 xxxManager.java 跟 xxx.java ?

但有的時候又是 xxxService.java 配 xxxManager.java ?



xxxManager.java 通常都是 AIDL (Android Interface Definition Language)

AIDL is an IDL language used to generate code that enables two processes on an Android-powered device.

這應該要想一想 @@

Service 自己是一個process ?@@

還是很多個Service都在一個process內 ? @@

不懂阿不懂

參考資料:




AIDL

在Android中,每個應用程序都可以有自己的進程.在寫UI應用的時候,經常要用到Service.在不同的進程中,怎樣傳遞對象呢?

顯然, Java中不允許跨進程內存共享.因此傳遞對象,只能把對象拆分成操作系統能理解的簡單形式,以達到跨界對象訪問的目的.

在J2EE中,採用RMI的方式,可以通過序列化傳遞對象.在Android中,則採用AIDL的方式.理論上AIDL可以傳遞Bundle,實際上做起來卻比較麻煩.





其他Android 開發文章請見: Android開發豆知識

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 tttt 的頭像
    tttt

    觀察筆記

    tttt 發表在 痞客邦 留言(1) 人氣()