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:
public class MyService extends Service { //创建一个录音机的实例 MediaRecorder recorder = null; //绑定服务 @Nullable @Override public IBinder onBind(Intent intent) { return null; } //解绑服务 @Override public void unbindService(ServiceConnection conn) { super.unbindService(conn); } //重新绑定服务 @Override public void onRebind(Intent intent) { super.onRebind(intent); } //创建一个Service 第一次开启的时候 @Override public void onCreate() { Log.i("wei","onCreate"); TelephonyManager tm = (TelephonyManager)getSystemService(TELEPHONY_SERVICE); tm.listen(new MyPhoneStateSeriverListener(),PhoneStateListener.LISTEN_CALL_STATE); super.onCreate(); } @Override public int onStartCommand(Intent intent, int flags, int startId) { Log.i("wei","onStartCommand"); return super.onStartCommand(intent, flags, startId); } @Override public void onDestroy() { super.onDestroy(); Log.i("wei","onDestroy"); } private class MyPhoneStateSeriverListener extends PhoneStateListener{ @Override public void onCallStateChanged(int state, String incomingNumber) { switch (state){ case TelephonyManager.CALL_STATE_IDLE://空闲状态 if (recorder!=null){ recorder.stop(); recorder.reset(); recorder.release(); } break; case TelephonyManager.CALL_STATE_OFFHOOK://接听状态 recorder.start();//开始录音 break; case TelephonyManager.CALL_STATE_RINGING://响铃状态 recorder.setAudioSource(MediaRecorder.AudioSource.VOICE_CALL);//设置音频的来源 MIC只能录单方的,VOICE_CALL可以录双方的 recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);//设置音频的输出格式 recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);//设置音频的编码方式 recorder.setOutputFile("/mnt/sdcard/luyin.3gp");//设置录音文件的存储位置 try { recorder.prepare();//准备录音 } catch (IOException e) { e.printStackTrace(); } break; } super.onCallStateChanged(state, incomingNumber); } } }
Manifest.xml配置:
<uses-permission android:name="android.permission.RECORD_AUDIO"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.READ_PHONE_STATE" />
报错,空指针异常。