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 @Override13 public void unbindService(ServiceConnection conn) {14 super.unbindService(conn);15 }16 17 //重新绑定服务18 @Override19 public void onRebind(Intent intent) {20 super.onRebind(intent);21 }22 23 //创建一个Service 第一次开启的时候24 @Override25 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 @Override34 public int onStartCommand(Intent intent, int flags, int startId) {35 Log.i("wei","onStartCommand");36 return super.onStartCommand(intent, flags, startId);37 }38 39 @Override40 public void onDestroy() {41 super.onDestroy();42 Log.i("wei","onDestroy");43 }44 private class MyPhoneStateSeriverListener extends PhoneStateListener{45 @Override46 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配置:
12 3
报错,空指针异常。