在Android 作業系統中,有許多的電話相關事件(Telephony Event)會對系統發送廣播訊息,簡訊事件也不例外,當系統收到(Receiver)訊息後,會由負責處理的Intent 接手處理,若要在自己撰寫的程式中,捕捉系統發出的簡訊廣播訊息,就必須利用BroadcastReceiver 物件來聆聽簡訊服務。
在Android 作業系統中,有許多的電話相關事件(Telephony Event)會對系統發送廣播訊息,簡訊事件也不例外,當系統收到(Receiver)訊息後,會由負責處理的Intent 接手處理,若要在自己撰寫的程式中,捕捉系統發出的簡訊廣播訊息,就必須利用BroadcastReceiver 物件來聆聽簡訊服務。
本範例將運用BroadcastReceiver 的特性,來實作取得手機電池計量的程式;程式中將藉由註冊BroadcastReceiver 時設定的IntentFilter(android.content.IntentFilter),來捕捉系統發出的 Intent.ACTION_BATTERY_CHANGED 這個Action,再藉此取得手機電池的計量結果。
這個範例練習,是在程式裡預設兩個固定簡訊內容,當按下「發送」按鈕(Button)時,會去撈取手機上的通訊錄,讓User 選擇要發送的對象,一旦選好聯絡人後,便返回程式,然後執行發送簡訊的功能。
Android 的Service 物件是以分時執行緒的方式執行,這表示即便是透過Activity 裡啟動Service,也不會在相同的process 執行,而是各自屬於不同的程序。
在收到簡訊後,除了Toast 提示簡訊內容之外,再透過Email 寄發到使用者的電子信箱中,讓User 可把重要的簡訊備份在個人的電子信箱中,再也不怕手機簡訊容量不足的問題。
手機最重要的功能不外乎是撥接電話、收發簡訊,PhoneStateListener 提供了聆聽這些事件的方法, 所以, 要監控手機電話狀態, 需建立PhoneStateListener 物件, 覆寫其中onCallStateChanged() 方法,透過傳入的「state」判斷來電狀態。
當有來電時,以Email 即時通知,這樣的Web 2.0 整合,便可視為反向的push-Email,即「Phone-to-Email」的應用方式之一。
記憶卡在Android 手機上是可以隨時插拔的,且在插入與拔起時,會對作業系統進行ACTION broadcast。在接下來的範例練習裡,將透過StatFs 檔案系統的方法取得MicroSD 記憶卡裡的剩餘空間。
這個範例練習將在Layout 裡設計兩個按鈕,分別對「手機記憶體」以及「SD Card」做「新增」、「刪除」的功能,而稍複雜的是本範例程式(Application)具有三個Activity,除了主程式的Entry Activity 之外,其餘兩個分別處理記憶體與記憶卡。
Android API 中提供了AlarmManager(android.app.AlarmManager)類別,可以設定在指定的時間執行某些動作,本範例將運用AlarmManager 來實作兩種不同類型的鬧鐘。
以往看見不想接的電話,總是得費一番功夫,無論是不禮貌的掛掉電話,或者來不及轉成鈴聲靜音,任由手機在角落鈴響到對方放棄為止,在這個範例程式具有機器 人(An-droid)的血統,可以自動過濾拒接者的來電,將電話鈴聲模式自動改成「靜音」模式,再也不用不禮貌的掛斷電話,或是因為來不及轉成靜音而打 擾到周圍的人。
本範例程式中,整合了SensorListener 以及AudioManager,當程式發現手機被翻背面時,就會將鈴聲模式變更為震動模式,尤其是在音樂會、上班會議中,萬一忘記將鈴聲調整為靜音震動時,就可以利用這支程式快速地關閉手機鈴聲。
本範例將製作一個每天自動更換桌面背景圖案的應用程式,使用者可以自訂每天想要更換的桌面背景圖案,當服務啟動後,每天的凌晨,手機就會自動更換桌面背景,省去手動換桌面背景的麻煩。
這個範例程式的學習重點在於如何衍生系統廣播類別(mServiceReceiver),並在此Receiver 當中,判斷簡訊發送的結果。
本範例的學習重點就是要在Service 裡,透過自訂廣播(Broadcast),讓原本的Activity 收到訊息並進行對應的處理,以本程式而言,則是在收到來自Service 的廣播訊息後,停止已開始的Service 服務。
這個範例非常簡單,只有一個主程式(Activity)、一個BroadcastReceiver 類別,這個程式只要執行一次,之後只要一開機就會執行這個程式,直到這個程式被移除為止。
這是一個非常實用的範例,其結果是在Activity 裡啟動系統背景服務,並在啟動服務之後,關閉Activity,接著在作業系統背景中執行監控,直到手機收到簡訊之後,判斷簡訊內容裡是否有設計好的關鍵 字,一旦發現關鍵字,則回傳簡訊給發訊者的電話,進而達到電信業者常用的「雙向簡訊」機制。
在Android SDK API Level 3 開始,即支援了各式各樣的Sensor,在此之前也介紹過,但本範例將以「TYPE_TEMPERATURE」當成android.hardware.Sensor在手機上實作「溫度計」功能,當然這個TYPE_TEMPERATURE Sensor 並非是為人體而設計,原始的設計初衷筆者構想應是測量電池的表面溫度,以偵測電池異常的高溫變化。
在Android Market 裡除了單獨執行的Application 之外,最受人歡迎的就屬Android手機小工具(Widget),這些可以隨意放置在手機桌面上的小程式,是繼承自AppWidgetProvider 而來,伴隨著新版SDK 的推出而有不同的嶄新功能,本範例將示範在桌面上設計一個電池模樣的小工具,隨著電池電量的變化而自動變換圖樣。
Android 手機通訊錄支援聯絡人設定多組電話號碼,在本章之前也實作過一些與聯絡人相關的範例,但大多是直接存取聯絡人,或取得第一筆(Cursor.moveToFirst())電話號碼,而無法取得該聯絡人完整多組電話號碼,此範例程式為以ListActivity為主體,直接向通訊錄存取聯絡人名稱列於清單當中,當User 點選聯絡人資料即撈出所有設定的多組電話號碼。