文章出處
文章列表
Service:服務,可以理解成一個運行再后臺沒有界面的Activity,集成于Seriver,是四大組件之一
Service的繼承關系:Service-->ContextWrapper-->Context (與activity一樣,都繼承與ContextWrapper);
生命周期:Context.startSeriver() 方法開啟服務:onCreate()-->onStartCommand()-->onDestory();
第一次開啟服務,服務會執行onCreate()-->onStartCommand();(開啟之后再開啟服務,不會執行onCreate()方法);
Context.bindSeriver() 方法開啟服務:onCreate()-->onBind()-->onUnbind()-->重載的方法返回true-->Rebind()-->onDestory();
開啟 :
方式一:startService();
方式二:bindService();
停止:
方式一:stopService();
方式二:unBind();
下面開始我們的來電監聽:
實現創建一個類繼承與Seriver:
1 public class MyService extends Service { 2 //創建一個錄音機的實例 3 MediaRecorder recorder = null; 4 //綁定服務 5 @Nullable 6 @Override 7 public IBinder onBind(Intent intent) { 8 return null; 9 } 10 11 //解綁服務 12 @Override 13 public void unbindService(ServiceConnection conn) { 14 super.unbindService(conn); 15 } 16 17 //重新綁定服務 18 @Override 19 public void onRebind(Intent intent) { 20 super.onRebind(intent); 21 } 22 23 //創建一個Service 第一次開啟的時候 24 @Override 25 public void onCreate() { 26 Log.i("wei","onCreate"); 27 TelephonyManager tm = (TelephonyManager)getSystemService(TELEPHONY_SERVICE); 28 tm.listen(new MyPhoneStateSeriverListener(),PhoneStateListener.LISTEN_CALL_STATE); 29 super.onCreate(); 30 31 } 32 33 @Override 34 public int onStartCommand(Intent intent, int flags, int startId) { 35 Log.i("wei","onStartCommand"); 36 return super.onStartCommand(intent, flags, startId); 37 } 38 39 @Override 40 public void onDestroy() { 41 super.onDestroy(); 42 Log.i("wei","onDestroy"); 43 } 44 private class MyPhoneStateSeriverListener extends PhoneStateListener{ 45 @Override 46 public void onCallStateChanged(int state, String incomingNumber) { 47 switch (state){ 48 case TelephonyManager.CALL_STATE_IDLE://空閑狀態 49 if (recorder!=null){ 50 recorder.stop(); 51 recorder.reset(); 52 recorder.release(); 53 } 54 break; 55 case TelephonyManager.CALL_STATE_OFFHOOK://接聽狀態 56 recorder.start();//開始錄音 57 break; 58 case TelephonyManager.CALL_STATE_RINGING://響鈴狀態 59 recorder.setAudioSource(MediaRecorder.AudioSource.VOICE_CALL);//設置音頻的來源 MIC只能錄單方的,VOICE_CALL可以錄雙方的 60 recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);//設置音頻的輸出格式 61 recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);//設置音頻的編碼方式 62 recorder.setOutputFile("/mnt/sdcard/luyin.3gp");//設置錄音文件的存儲位置 63 try { 64 recorder.prepare();//準備錄音 65 } catch (IOException e) { 66 e.printStackTrace(); 67 } 68 break; 69 } 70 super.onCallStateChanged(state, incomingNumber); 71 } 72 } 73 }
Manifest.xml配置:
1 <uses-permission android:name="android.permission.RECORD_AUDIO"/> 2 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 3 <uses-permission android:name="android.permission.READ_PHONE_STATE" />
報錯,空指針異常。
文章列表
全站熱搜