【android基礎篇】自訂廣播和電話監聽

來源:互聯網
上載者:User

標籤: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基礎篇】自訂廣播和電話監聽

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.