標籤:des android style blog io ar color os sp
I,自訂廣播
前面所說的都是接收簡訊,撥出電話等都是系統所有的廣播,而其實我們可以自己自訂一個廣播,並且寫一個廣播接收者來玩玩。
1)
在按鈕的點擊方法中,發送自訂的廣播:
1 public void click(View view){2 /**3 * 發送自訂的廣播4 */5 Intent intent=new Intent();6 //設定意圖的動作,要和自訂的頻道要一致7 intent.setAction("www.wangchengxiang.com");8 sendBroadcast(intent);9 }
setAction方法,理解為設定意圖的活動,也就是廣播接收者需要接收的頻道。
發送自訂廣播,光代碼也就這麼幾行,其實發送廣播的方法就有好幾種,且它們之間都有很大的差別。
2)
sendBroadcast(intent);
它發送的是無序廣播,特點就是任何廣播接收者都可以接收到這個廣播。
sendOrderedBroadcast(intent, receiverPermission);
它發送的是有序廣播,廣播接收者會讓優先順序的次序依次的接收到廣播。上篇在廣播接收者的配置中有過優先順序的配置,關於優先順序,最大值為1000,最小為-1000,預設的為0.
而receiverPermission表示的是廣播接收者的許可權,如果不關心,寫為null。
當發送的是有序廣播時,比如有多個廣播接收者都有接收到,如果在高優先順序的廣播接收者中,執行abortBroadCast()方法,那麼低優先順序的廣播接收者將不會觸發onReceive方法。
所以為了防止,有惡意的廣播接收者,故意中斷廣播,又誕生出另一種方法,可以指定某個廣播接收者一定要接收到廣播。
sendOrderedBroadcast(intent, receiverPermission, resultReceiver, scheduler, initialCode, initialData, initialExtras)
resultReceiver參數表示的就是一定會接收到的廣播接收者,即使在高優先順序的廣播接收者中,中斷了廣播,這個廣播接收者也會執行到。
那麼為什麼google的工程師要這麼做呢?
比如打電話,就可以認為是一個廣播接收者,如果有高優先順序的廣播接收者中斷了廣播,那麼預設為0的電話廣播接收者豈不是不能打電話,而打電話對於我們是多麼的重要。
所以有的時候,這個方法會派上大用場。
II,電話監聽
1)
四大組件的最後一個Service,表示的是服務之意,也引申於window下的服務。
安卓下的服務的特點:長期運行在後台,沒有介面的應用程式。
服務最大的特點也是這兩點,長期運行在後台,有的應用就特別適合用服務去實現,比如天氣預報,它可以長期隔一段時間去伺服器擷取天氣資訊。
所以總結而來,服務可以用來做一些後台監聽和擷取資料等操作。
接下來就用電話監聽來談談服務。
2)
定義一個類實現Service,並在資訊清單檔中配置,這樣一個服務類就建立。在服務類下,先瞭解幾個方法:
onCreate,服務建立就會調用,onDestroy,服務銷毀會調用。
在activity類中開啟服務:
1 /**2 * 指定開啟的服務的名稱。3 * 開啟服務4 */5 Intent intent=new Intent(this,PhoneService.class);6 startService(intent);
當開啟服務後,就會去調用onCreate方法,我們就可以在該方法中擷取到電話的狀態。
要擷取電話狀態的變化,就需要管理電話的服務,那麼如何擷取管理電話的服務,這裡要通過電話管理器。
TelephonyManager tm=(TelephonyManager) getSystemService(TELEPHONY_SERVICE);tm.listen(new MyListener(), PhoneStateListener.LISTEN_CALL_STATE);
第一行代碼錶示:擷取到管理電話語音的電話管理器。
第二行代碼錶示當電話狀態改變時(PhoneStateListener.LISTEN_CALL_STATE),會回調MyListener中的方法。
而MyListener繼承自PhoneStateListener。當通話狀態發生變化時,就會調用MyListener中的方法,附上MyListener代碼:
1 private class MyListener extends PhoneStateListener{ 2 /** 3 * 定義一個收音機 4 */ 5 private MediaRecorder recorder; 6 /** 7 * 手機的通話狀態發生變化時,會去調用 8 */ 9 @Override10 /**11 * state:電話狀態12 * incomingNumber:來電的電話13 */14 public void onCallStateChanged(int state, String incomingNumber) {15 try {16 switch(state){17 case TelephonyManager.CALL_STATE_IDLE://通話閒置狀態18 //結束錄音操作,錄製的音頻檔案上傳到伺服器19 if(recorder!=null){ 20 recorder.stop();21 recorder.reset(); 22 recorder.release();23 }24 break;25 case TelephonyManager.CALL_STATE_RINGING://響鈴的狀態26 System.out.println("發現來電號碼:"+incomingNumber); 27 recorder = new MediaRecorder();28 /**29 * 設定錄製的音頻源MIC:表示從話筒中擷取聲音。標準的手機作業系統是不支援錄音的。國產的山寨機可以錄製。30 */31 recorder.setAudioSource(MediaRecorder.AudioSource.MIC);32 /**33 * OutputFormat:檔案格式。THREE_GPP:3gp的格式34 */35 recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);36 /**37 * AudioEncoder:聲音編碼的方式38 */39 recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);40 /**41 * 錄製的聲音寫到哪裡,參數為檔案的路徑。這裡寫到sd卡中,當然也可以上傳到伺服器上。42 */43 recorder.setOutputFile("/sdcard"+System.currentTimeMillis()+".3gp");44 /**45 * 通知錄音機準備開始錄製46 */47 recorder.prepare();48 /**49 * 開始錄製50 */51 recorder.start(); 52 break;53 case TelephonyManager.CALL_STATE_OFFHOOK://通話狀態54 /**55 * 當手機接到電話時,HOME鍵,後退鍵,菜單鍵都是沒效的。56 * 只有接通或掛斷,才會生效。57 */58 if(recorder!=null){59 recorder.start(); 60 }61 break;62 default:63 break;64 }65 } catch (Exception e) {66 e.printStackTrace();67 }68 super.onCallStateChanged(state, incomingNumber);69 }70 }
通過以上,就可以實現電話竊聽。
【android基礎篇】自訂廣播和電話監聽