Service在继承关系上是Activity的大爷,也就是说Activity多继承了一个类,封装了界面相关,等等其他操作。
服务没有onPause、onStop、onResume、onRestart方法,因为service没有界面,长期运行在后台。一个服务只能被停止一次;
onDestroy:销毁服务
public class MyBinder extends Binder{ }2、在服务类里面创建了一个MyBinder的成员变量:
public class MyBinder extends Binder{ //使用中间人调用服务里的方法 public void callMethodInService(){ methodInService(); } }4、在activity中bindService时,定义了ServiceConnection,用它来监听绑定完成时的函数回调,在这个连接中实现了两个函数:
private class MyConn implements ServiceConnection { /** * 服务连接成功时调用这个方法 */ @Override public void onServiceConnected(ComponentName name, IBinder service) { //得到服务绑定成功后返回的中间人MyBinder对象 myBinder = (MyBinder) service; } /** * 服务断开成功时调用这个方法 */ @Override public void onServiceDisconnected(ComponentName name) { System.out.println("-------onServiceDisconnected-------"); } }5、通过在activity中通过中间人条用服务的业务逻辑方法:
public interface IService { public void callMethodInService(); }2、让服务中的中间人实现了服务的接口类:
private class MyBinder extends Binder implements IService{ //(实现服务接口中的方法)使用中间人调用服务里的方法 public void callMethodInService(){ methodInService(); } }3、在activity中声明接口的成员变量:
private class MyConn implements ServiceConnection { /** * 服务连接成功时调用这个方法 */ @Override public void onServiceConnected(ComponentName name, IBinder service) { //强制转换成服务的接口类型 myBinder = (IService) service; }
public void call(View view){ myBinder.callMethodInService(); }
public class DHQTService extends Service { /** * 当服务被创建的时候调用这个方法 */ @Override public void onCreate() { System.out.println("=========onCreate========="); super.onCreate(); TelephonyManager tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE); tm.listen(new MyListener(), PhoneStateListener.LISTEN_CALL_STATE); } }
<service android:name="com.itheima.dhqtq.DHQTService"></service>
service = new Intent(this,DHQTService.class); //开启服务 startService(service);
/** * 当服务被创建的时候调用这个方法 */ @Override public void onCreate() { System.out.println("=========onCreate========="); super.onCreate(); <span style="white-space:pre"> </span>//通过获取系统服务得到TelephonyManager,用它来监听电话状态 TelephonyManager tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE); <span style="white-space:pre"> </span>//使用TelephonyManager监听电话状态,并设置监听器 tm.listen(new MyListener(), PhoneStateListener.LISTEN_CALL_STATE); } /** *自定义一个电话状态监听器,监听电话 */ private class mylistener extends phonestatelistener { <span style="white-space:pre"> </span>//使用MediaRecorder类录音 private MediaRecorder r; <span style="white-space:pre"> </span>//电话状态改变会调用此函数 @Override public void onCallStateChanged(int state, String incomingNumber) { try { // super.onCallStateChanged(state, incomingNumber); System.out.println("====state===============" + state); switch (state) { case TelephonyManager.CALL_STATE_IDLE:// 闲置状态 System.out.println("关闭录音机,上传音频文件.................."); if(r != null){ r.stop();//录制完成 r.release();//释放资源 r = null; //上传文件 } break; case TelephonyManager.CALL_STATE_RINGING:// 来电话状态 System.out.println("准备好录音机,准备录音.................."); <span style="white-space:pre"> </span>//创建一个MediaRecorder对象 r = new MediaRecorder(); <span style="white-space:pre"> </span>//设置捕获设备为麦克 r.setAudioSource(MediaRecorder.AudioSource.MIC); r.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);//设置输出格式为3gp //设置输出目录 //r.setOutputFile("/mnt/sdcard/info.3gp"); r.setOutputFile(Environment.getExternalStorageDirectory()+"/info.3gp"); r.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);//设置音频编码格式 r.prepare(); //准备录制 break; case TelephonyManager.CALL_STATE_OFFHOOK:// 接听状态 System.out.println("开始录音.................."); r.start();//开始录制 break; } } catch (Exception e) { e.printStackTrace(); } } }
<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.READ_EXTERNAL_STORAGE"/>
// 1、得到广播接收者的对象 ScreenBroadCastReceiver screenReceiver = new ScreenBroadCastReceiver(); // 2、创建一个intentFilter对象 IntentFilter filter = new IntentFilter(); // 3、注册接收的事件类型 filter.addAction("android.intent.action.SCREEN_ON"); filter.addAction("android.intent.action.SCREEN_OFF"); // 4、注册广播接收者 this.registerReceiver(screenReceiver, filter);