最近搞一個監控狀態的小程式,利用 Android 呼叫特定的網頁,取得資訊呈現在手機上。人總是懶惰的,不想老是要慢慢地輸入主機 IP ,所以就想把它記錄在程式設定中,每次啟動程式先去抓預設值。
因為只是一個很簡單的程式,所以不想為了它去深入研究 SQLite ,所以後來同事選擇使用 SharedPreferences 來記錄程式設定,但是要被監控的主機不只一台,但是能記錄的資料卻沒有陣列可以使用,所以討論後決定使用字串切割的方式來儲存資料。
一開始測試還算順利,String 有提供 split 函數,可以把字串變成陣列。用來呈現主機的 IP 位置到一個事先準備好的 ListView 中。不過當程式離開、關閉的時候,要怎麼把字串拼回去,這就讓我們犯難了,因為 Array 並沒有提一個叫作 join 的函數,這是在 PHP 或 FLEX 已經習慣使用的東西。
2011年7月19日 星期二
2011年6月24日 星期五
記錄自己刷手機 ROM
手上的 Vibo A688 是去年前入手的手機,也是我第一支 Android 手機,由於公司裡的 MIS 也有一台相同的機器,因此每次有新的 ROM,只要麻煩它就可以在幾個小時候,有新的系統可以用。不過前陣子他把手機賣了,準備入手更新的手機,因此就不好意思再繼續麻煩他,就自己試著刷機看看。
並不是因為要求最新,為改變而改變,而是因為原廠提供作業系統,總是有一些讓人受不了的缺點,有人作過比較,發現台灣官方放出來內建在手機的預設系統,通常都會附有一些電信商或合作廠的應用程式,那種幾百年都用不到一次的軟體,反而是拖慢手機速度,造成效率不彰、電池很容易就沒電的主要因素。也許部分的人會覺得很方便,可以不用自己再去找軟體,但是對我而言就不是這麼一會事。
我覺得「花錢買手機不是讓手機去作太多無關緊的事情」,所以得去研究如何把系統換成更乾淨、更快速的。
並不是因為要求最新,為改變而改變,而是因為原廠提供作業系統,總是有一些讓人受不了的缺點,有人作過比較,發現台灣官方放出來內建在手機的預設系統,通常都會附有一些電信商或合作廠的應用程式,那種幾百年都用不到一次的軟體,反而是拖慢手機速度,造成效率不彰、電池很容易就沒電的主要因素。也許部分的人會覺得很方便,可以不用自己再去找軟體,但是對我而言就不是這麼一會事。
我覺得「花錢買手機不是讓手機去作太多無關緊的事情」,所以得去研究如何把系統換成更乾淨、更快速的。
2011年6月5日 星期日
2011年6月3日 星期五
Android 的排版學習 (一) - LinearLayout
學習 Android 的過程中,讓我覺得很挫折的一點,在於我怎麼也排不出讓我滿意的畫面。雖說寫程式的人大多重視功能,而不是畫面的美觀。但是作出來的程式連自己都不想多用一會兒,那就很明顯是失敗了。
翻了一些 Android 的中文書,發現裡頭提到有關版型的篇幅很少,少到讓人無法搞懂要怎麼排出一個「能看」的畫面。所以就「憤而」轉投官方文件(英文),才有前面幾篇 Android 的文章,在忙完論文提要口試文件之後,終於可以回頭繼續研究。
翻了一些 Android 的中文書,發現裡頭提到有關版型的篇幅很少,少到讓人無法搞懂要怎麼排出一個「能看」的畫面。所以就「憤而」轉投官方文件(英文),才有前面幾篇 Android 的文章,在忙完論文提要口試文件之後,終於可以回頭繼續研究。
2011年4月7日 星期四
Android 的程式基礎(四) - Manifest File
感覺上,Manifest 檔案有點像是 Java Servlet 的設定檔案,都是用來告訴系統自己的存在以及有哪些功能,應該被如何呼叫、啟動裡面的函數。
在 Android 的四種元素中,Activity、Service、Content Provider都是需要被定義在這個用 XML 格式寫成的設定檔中,否則系統是不承認的,結果就是無法被呼叫、執行。唯一的例外是 Broadcast receiver,它可以在程式執行途中被建立、註冊到系統上,使用一個叫作 registerReceiver() 的方法。
也就是說,必須在 Manifest 定義,否則無法使用 Intent 啟動 Activity 和 Service。
除了定義 Activity 之外,Manifest 也定義這個應用程式需要的系統的配置,像是程式需要有相機鏡頭或是藍牙連線功能,或是最低的 API Level 也就是這個程式最低需要的 Android 第幾版,如︰2.2 版之後機器。每一個釋出的版本,都有對應的一個 API Level 編號,像是 2.2 對應到 API Level 8。
由此看得出, Android 是設計向下相容的。不過支援度如何,就有待之後的驗證了。像是最新蜂巢3.x 能不能完整支援 2.x 版的程式,個人抱著懷疑的態度。
Manifest所定義的資料, Android 系統只把它作為一個「額外的資訊」,只有 Market 才會讀取它,讓搜尋的過程中不會出現不符使用者裝置的應用軟體被裝入。所以,如果直接拿 apk 安裝的話,應該就不會作阻擋的動作。
Manifest 的另一個功能,則是定義 Intent filter(意圖過濾?),也就是之前文章中提到的問題。藉由定義的字串(如︰send 表示發出郵件)表示功能需求,讓自己的應用程式也可以去「處理」這件事情。當 Android 發現有兩個以上程式可以處理,就會出現選單讓使用者進行選擇。一個常見的例子為︰當使用者安裝其它瀏覽器後,當使用者發出「瀏覽網頁」的意圖(Intent)時,系統就會列出既有的和新裝入的瀏覽器讓使用者選擇。
在 Android 的四種元素中,Activity、Service、Content Provider都是需要被定義在這個用 XML 格式寫成的設定檔中,否則系統是不承認的,結果就是無法被呼叫、執行。唯一的例外是 Broadcast receiver,它可以在程式執行途中被建立、註冊到系統上,使用一個叫作 registerReceiver() 的方法。
也就是說,必須在 Manifest 定義,否則無法使用 Intent 啟動 Activity 和 Service。
除了定義 Activity 之外,Manifest 也定義這個應用程式需要的系統的配置,像是程式需要有相機鏡頭或是藍牙連線功能,或是最低的 API Level 也就是這個程式最低需要的 Android 第幾版,如︰2.2 版之後機器。每一個釋出的版本,都有對應的一個 API Level 編號,像是 2.2 對應到 API Level 8。
由此看得出, Android 是設計向下相容的。不過支援度如何,就有待之後的驗證了。像是最新蜂巢3.x 能不能完整支援 2.x 版的程式,個人抱著懷疑的態度。
Manifest所定義的資料, Android 系統只把它作為一個「額外的資訊」,只有 Market 才會讀取它,讓搜尋的過程中不會出現不符使用者裝置的應用軟體被裝入。所以,如果直接拿 apk 安裝的話,應該就不會作阻擋的動作。
Manifest 的另一個功能,則是定義 Intent filter(意圖過濾?),也就是之前文章中提到的問題。藉由定義的字串(如︰send 表示發出郵件)表示功能需求,讓自己的應用程式也可以去「處理」這件事情。當 Android 發現有兩個以上程式可以處理,就會出現選單讓使用者進行選擇。一個常見的例子為︰當使用者安裝其它瀏覽器後,當使用者發出「瀏覽網頁」的意圖(Intent)時,系統就會列出既有的和新裝入的瀏覽器讓使用者選擇。
2011年4月6日 星期三
Android 的程式基礎(三)-Intent
在中文裡被翻譯成「意圖」,雖然覺得很彆扭,但是也想不到什麼更好的詞。
Android 程式組成四種元素(Activity、Service、Content Provider、Broadcast receiver)中,除了Content Provider 之外,其它三種都是經由 Intent 所啟動的。以這個規則來猜測,應用程式選單也是一個 Android 程式,列出大部分(不敢說是全部)可以被 Intent 啟動的程式,再代替使用者建立並發出 Intent。
因為不同的元素是繼承於各自的基底類別,所以啟動的方式也不一樣。像是 Activity 使用 Intent.startActivity() 啟動其它程式,或者呼叫 Intent.startActivityForResult() 啟動並等待被啟動的程式回傳訊息(例︰要求相機程式拍完相片,把相片資訊傳回來)。而 Service 除了可以經有 Intent 啟動(startService) 也可以和運作中的 Service 連結(bindService)。
至於 Broadcast receiver 到目前為止還沒能搞清楚它的運作方式,等到基礎文件看完後再去研究好了。
Intent 可以視為一種「要求訊息」,除了用來告訴 Android 系統啟動某程式/服務外,也可以帶有訊息,利用 URI 的方式,像是呼叫手機的播號程式會帶有要播打的號碼,發信程式會帶有目標 Email Address。除了這類訊息之外,在其它書上的例子中還看到可以把要傳遞的資料「打包」一併傳過去,這樣才能傳遞多個或是非文字(二進位)的資料。打包也是等到之後研究到再作筆記。
另外還不了解的,則是 Intent 要如何去綁定,最基本以套件加類別名稱的作法在其它書本上已經看到過。不過怎麼作出像「開啟瀏覽器」這樣可以讓系統彈出選單,詢問要使用哪一種瀏覽器的結果。就不知道了,只能猜出應該是同一個 Intent 訊息中,綁上二個以上的程式,系統無法決定要啟動哪一個的時候就跳出視窗詢問。
不知道像是瀏覽器這類的 Intent 訊息是系統已經定義好的那幾種,還是可以自訂新的種類。等到深入研究的時候應該就會知道了吧!
Android 程式組成四種元素(Activity、Service、Content Provider、Broadcast receiver)中,除了Content Provider 之外,其它三種都是經由 Intent 所啟動的。以這個規則來猜測,應用程式選單也是一個 Android 程式,列出大部分(不敢說是全部)可以被 Intent 啟動的程式,再代替使用者建立並發出 Intent。
因為不同的元素是繼承於各自的基底類別,所以啟動的方式也不一樣。像是 Activity 使用 Intent.startActivity() 啟動其它程式,或者呼叫 Intent.startActivityForResult() 啟動並等待被啟動的程式回傳訊息(例︰要求相機程式拍完相片,把相片資訊傳回來)。而 Service 除了可以經有 Intent 啟動(startService) 也可以和運作中的 Service 連結(bindService)。
至於 Broadcast receiver 到目前為止還沒能搞清楚它的運作方式,等到基礎文件看完後再去研究好了。
Intent 可以視為一種「要求訊息」,除了用來告訴 Android 系統啟動某程式/服務外,也可以帶有訊息,利用 URI 的方式,像是呼叫手機的播號程式會帶有要播打的號碼,發信程式會帶有目標 Email Address。除了這類訊息之外,在其它書上的例子中還看到可以把要傳遞的資料「打包」一併傳過去,這樣才能傳遞多個或是非文字(二進位)的資料。打包也是等到之後研究到再作筆記。
另外還不了解的,則是 Intent 要如何去綁定,最基本以套件加類別名稱的作法在其它書本上已經看到過。不過怎麼作出像「開啟瀏覽器」這樣可以讓系統彈出選單,詢問要使用哪一種瀏覽器的結果。就不知道了,只能猜出應該是同一個 Intent 訊息中,綁上二個以上的程式,系統無法決定要啟動哪一個的時候就跳出視窗詢問。
不知道像是瀏覽器這類的 Intent 訊息是系統已經定義好的那幾種,還是可以自訂新的種類。等到深入研究的時候應該就會知道了吧!
2011年4月1日 星期五
Android 的程式基礎(二) - 基本元件
和 Java 的 servlet 想法類似,程式不具有 main() 函數作為入口,而是繼承特有的類別,利用物件導向的多型原則,由另外的啟動器來把程式執行起來。HttpServlet 就是 Java Servlet 所可以繼承的其中一個類別,繼承這個類別的,都可以視為一個 servlet 程式。
同樣的,繼承 Android 所認可的類別,就可以被 Android 視為合格的程式,並在特定的時間被呼叫、啟動。而 Android 所認可的類別有 4 種︰
1. Activities︰在中文被翻成很奇怪的「機動程式」,主要用在於一般提供使用者操作介面的程式,繼承 Activity 類別
2. Services︰能在背景執行的程式,不受程式切換而停止。像是音樂播放功能需要放在 Services 類型的程式,這樣才能一面作其它事情,一面聽音樂。繼承 Service 類別
3. Content providers︰提供內容,在物件導向裡,會把資料存取的功能,獨立型成一組類別,讓其它程式只需要知道向它要求或是存入資料,不需要理會背後的實作方式。Content provider 可以和許多不同的媒體溝通,像是 SQLite,網路甚至是其它提供存取權限的程式。繼承 ContentProvider 類別
4. Broadcast receivers︰用來接受事件的類別,例如想要寫一個整理簡訊的應用程式,而捕捉收到簡訊事件就需要靠這種類別。可能和的 Service 合用,讓接受事件的行為在背景運作。繼承 BroadcastReceiver 類別
延續上一篇的內容,由於每一支 Android 程式都是在一個執行緒中(也許應該叫線程 process),所以不單單是沒有 main() 函數,程式之間也不能進行直接呼叫,也因此 Android 提供一個叫作「Intent(意圖)」這個我同樣覺得翻得滿怪的東西,利用告訴系統「想要開某某程式的『想法』」,系統確認有權限後就會代為處理開啟。
就其它書上的說法,意圖不單單只有開啟程式的作用而已,還包含其它的功能。不過目前功能還不到,就留到之後的文章描述吧!
同樣的,繼承 Android 所認可的類別,就可以被 Android 視為合格的程式,並在特定的時間被呼叫、啟動。而 Android 所認可的類別有 4 種︰
1. Activities︰在中文被翻成很奇怪的「機動程式」,主要用在於一般提供使用者操作介面的程式,繼承 Activity 類別
2. Services︰能在背景執行的程式,不受程式切換而停止。像是音樂播放功能需要放在 Services 類型的程式,這樣才能一面作其它事情,一面聽音樂。繼承 Service 類別
3. Content providers︰提供內容,在物件導向裡,會把資料存取的功能,獨立型成一組類別,讓其它程式只需要知道向它要求或是存入資料,不需要理會背後的實作方式。Content provider 可以和許多不同的媒體溝通,像是 SQLite,網路甚至是其它提供存取權限的程式。繼承 ContentProvider 類別
4. Broadcast receivers︰用來接受事件的類別,例如想要寫一個整理簡訊的應用程式,而捕捉收到簡訊事件就需要靠這種類別。可能和的 Service 合用,讓接受事件的行為在背景運作。繼承 BroadcastReceiver 類別
延續上一篇的內容,由於每一支 Android 程式都是在一個執行緒中(也許應該叫線程 process),所以不單單是沒有 main() 函數,程式之間也不能進行直接呼叫,也因此 Android 提供一個叫作「Intent(意圖)」這個我同樣覺得翻得滿怪的東西,利用告訴系統「想要開某某程式的『想法』」,系統確認有權限後就會代為處理開啟。
就其它書上的說法,意圖不單單只有開啟程式的作用而已,還包含其它的功能。不過目前功能還不到,就留到之後的文章描述吧!
2011年3月27日 星期日
Android 的程式基礎(一)
看了部分官網的說明,在這裡寫寫筆記,複習、也加深自己的印象。 使用者清單
Android 是一個以 Linux Kernel 2.6 為基底的作業系統,由 Kernel 、函數庫、 Runtime、 框架以及應用程式所組成。一般軟體程式的寫作人員所開發的,就是應用程式層。了解其底下各層所負責的項目和協作方式,對於程式的了解有很大的幫助(個人一直這麼認為)。
由於是以 Linux Kernel 所發展,所以許多函數庫是以 C 或 C++ 寫成。不過中間經過框架和Runtime,實際上撰寫應用程式時,是以 Java 程式進行。由其它地方看到的訊息,那是一個由 Java 分支於 Apache 的專案衍生出來的,不過由於授權模式並不是很清楚,就演變成之前買下 Sun 的甲骨文公司告 Google 侵權的狀況。
除了部分 Java 核心的類別之外, Android 也加入了許多自己的函數庫,總體而言帶有很重的 Java 風格。但一些差異點,仍然會讓考過 SCJP 的我,搞不清楚狀況。又從頭開始看起 Google 的官方文章。
和 Java 程式中會有 main 啟始函數不同,在 Android 的應用程式都不算是「獨立」的程式,而是作為被另一支程式所呼叫,所以 Android 應用程式,實際都是繼承於 Activity 類別而來,我個人覺得把它翻譯為「活動」類別比較貼切,而不是其它中文書中叫它「機動程式」,一整個很彆扭,讓我一開始一直陷入「它到底哪裡『激動』了」的問題。
Java 程式語言是一個多執行緒的語言,在 Android 也承習了這個概念,當一支程式將被啟動, Android 就建立一個新的執行緒,並且啟動對應的程式。這個時候繼承於 Activity 的效果就出現了,啟動器只知道啟動了一個 Activity 類別,並不在意實際被執行的是哪一個子類別,只要利用父類別(Activity)提供的方法,就可以控制程式的啟動、暫停、終止…等。一個程式設計原則「對父類別撰寫程式」被應用的實例。
在 Android 平台中所不同的地方,在於程式並不單只是不同執行緒,而且在運作的過程中,也配給不同的 User ID,這是利用 Linux 作業系統多用戶的特性。利用 Linux 檔案權限的控管,加上不同應用程式帶有不同 User ID,就可以保護不同的程式彼此之間不會互相干擾,修改到其它程式的檔案,也能夠保護重要的系統資源不被破壞。
在某個特殊的狀況下(還沒看到是什麼狀況),兩支帶有相同驗證資料的應用程式,可以帶有相同的 User ID,待在同一個執行緒中,享受到資源共享的方便。不然就得依照 Android 的規則,開出能夠被其它程式存取的介面,來分享或傳遞資訊。
另外,像是藍牙、Wifi、GPS、SD記憶卡以及通訊錄、電話…等,也是可以被應用程式存取。不過必需要在安裝的時候,提供使用者,取得同意後才能夠進行存取。
Android 是一個以 Linux Kernel 2.6 為基底的作業系統,由 Kernel 、函數庫、 Runtime、 框架以及應用程式所組成。一般軟體程式的寫作人員所開發的,就是應用程式層。了解其底下各層所負責的項目和協作方式,對於程式的了解有很大的幫助(個人一直這麼認為)。
由於是以 Linux Kernel 所發展,所以許多函數庫是以 C 或 C++ 寫成。不過中間經過框架和Runtime,實際上撰寫應用程式時,是以 Java 程式進行。由其它地方看到的訊息,那是一個由 Java 分支於 Apache 的專案衍生出來的,不過由於授權模式並不是很清楚,就演變成之前買下 Sun 的甲骨文公司告 Google 侵權的狀況。
除了部分 Java 核心的類別之外, Android 也加入了許多自己的函數庫,總體而言帶有很重的 Java 風格。但一些差異點,仍然會讓考過 SCJP 的我,搞不清楚狀況。又從頭開始看起 Google 的官方文章。
和 Java 程式中會有 main 啟始函數不同,在 Android 的應用程式都不算是「獨立」的程式,而是作為被另一支程式所呼叫,所以 Android 應用程式,實際都是繼承於 Activity 類別而來,我個人覺得把它翻譯為「活動」類別比較貼切,而不是其它中文書中叫它「機動程式」,一整個很彆扭,讓我一開始一直陷入「它到底哪裡『激動』了」的問題。
Java 程式語言是一個多執行緒的語言,在 Android 也承習了這個概念,當一支程式將被啟動, Android 就建立一個新的執行緒,並且啟動對應的程式。這個時候繼承於 Activity 的效果就出現了,啟動器只知道啟動了一個 Activity 類別,並不在意實際被執行的是哪一個子類別,只要利用父類別(Activity)提供的方法,就可以控制程式的啟動、暫停、終止…等。一個程式設計原則「對父類別撰寫程式」被應用的實例。
在 Android 平台中所不同的地方,在於程式並不單只是不同執行緒,而且在運作的過程中,也配給不同的 User ID,這是利用 Linux 作業系統多用戶的特性。利用 Linux 檔案權限的控管,加上不同應用程式帶有不同 User ID,就可以保護不同的程式彼此之間不會互相干擾,修改到其它程式的檔案,也能夠保護重要的系統資源不被破壞。
在某個特殊的狀況下(還沒看到是什麼狀況),兩支帶有相同驗證資料的應用程式,可以帶有相同的 User ID,待在同一個執行緒中,享受到資源共享的方便。不然就得依照 Android 的規則,開出能夠被其它程式存取的介面,來分享或傳遞資訊。
另外,像是藍牙、Wifi、GPS、SD記憶卡以及通訊錄、電話…等,也是可以被應用程式存取。不過必需要在安裝的時候,提供使用者,取得同意後才能夠進行存取。
訂閱:
文章 (Atom)