zl程序教程

您现在的位置是:首页 >  移动开发

当前栏目

Android实训案例(七)——四大组件之一Service初步了解,实现通话录音功能,抽调接口

Android案例接口组件 实现 功能 了解 Service
2023-09-14 08:59:39 时间
public int onStartCommand(Intent intent, int flags, int startId) { return super.onStartCommand(intent, flags, startId); @Override public void onCreate() { super.onCreate(); @Override public void onDestroy() { super.onDestroy(); }

我们来写个小案例,就是用service监听通话,录音之后保存下来,我們在button中启动这个service,然后在service中一创建,我们就获取电话状态


//服务一创建就监听 TelephonyManager tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE); tm.listen(new myListener(), PhoneStateListener.LISTEN_CALL_STATE);
public void onCallStateChanged(int state, String incomingNumber) { super.onCallStateChanged(state, incomingNumber); //判断当前的状态 switch (state) { //电话空闲 case TelephonyManager.CALL_STATE_IDLE: Log.i("myListener", "电话空闲"); break; //电话响铃 case TelephonyManager.CALL_STATE_RINGING: Log.i("myListener", "电话响铃"); break; //正在通话 case TelephonyManager.CALL_STATE_OFFHOOK: Log.i("myListener", "电话通话"); break; }
public int onStartCommand(Intent intent, int flags, int startId) { return super.onStartCommand(intent, flags, startId); @Override public void onCreate() { super.onCreate(); getService(); * 获取电话状态 public void getService() { //服务一创建就监听 TelephonyManager tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE); tm.listen(new myListener(), PhoneStateListener.LISTEN_CALL_STATE);
public void onCallStateChanged(int state, String incomingNumber) { super.onCallStateChanged(state, incomingNumber); //判断当前的状态 switch (state) { //电话空闲 case TelephonyManager.CALL_STATE_IDLE: Log.i("myListener", "电话空闲"); if(recorder != null){ //停止录音 recorder.stop(); //释放资源 recorder.release(); recorder = null; break; //电话响铃 case TelephonyManager.CALL_STATE_RINGING: Log.i("myListener", "电话响铃"); //判断硬件是否支持录音 if (recorder == null) { getRecorder(); break; //正在通话 case TelephonyManager.CALL_STATE_OFFHOOK: Log.i("myListener", "电话通话"); if(recorder != null){ //开始录音 recorder.start(); break; * 通话录音 private void getRecorder() { recorder = new MediaRecorder(); //麦克风 recorder.setAudioSource(MediaRecorder.AudioSource.MIC); //设置格式 3GP recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); //设置保存目录 权限 recorder.setOutputFile("sdcard/audio.3gp"); //设置音频编码 recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); try { //准备录音 recorder.prepare(); } catch (IOException e) { e.printStackTrace(); @Override public void onDestroy() { super.onDestroy();
 ?xml version="1.0" encoding="utf-8"? 

 LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

 xmlns:tools="http://schemas.android.com/tools"

 android:layout_width="match_parent"

 android:layout_height="match_parent"

 android:gravity="center"

 android:orientation="vertical" 

 Button

 android:id="@+id/btn_start"

 android:text="启动服务"

 android:layout_width="wrap_content"

 android:layout_height="wrap_content" / 

 Button

 android:id="@+id/btn_stop"

 android:text="停止服务"

 android:layout_width="wrap_content"

 android:layout_height="wrap_content" / 

 Button

 android:id="@+id/btn_bind"

 android:text="绑定服务"

 android:layout_width="wrap_content"

 android:layout_height="wrap_content" / 

 Button

 android:id="@+id/btn_unbind"

 android:text="解除绑定"

 android:layout_width="wrap_content"

 android:layout_height="wrap_content" / 

 /LinearLayout 


protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); conn = new MyConn(); private void initView() { btn_start = (Button) findViewById(R.id.btn_start); btn_stop = (Button) findViewById(R.id.btn_stop); btn_bind = (Button) findViewById(R.id.btn_bind); btn_unbind = (Button) findViewById(R.id.btn_unbind); btn_start.setOnClickListener(this); btn_stop.setOnClickListener(this); btn_bind.setOnClickListener(this); btn_unbind.setOnClickListener(this);
case R.id.btn_bind: bindService(new Intent(this,OneService.class),conn,BIND_AUTO_CREATE); break; case R.id.btn_unbind: unbindService(conn); break; * 服务回调 class MyConn implements ServiceConnection{ //到服务的连接被建立了 @Override public void onServiceConnected(ComponentName name, IBinder service) { //到服务的连接中断了 @Override public void onServiceDisconnected(ComponentName name) {
public int onStartCommand(Intent intent, int flags, int startId) { return super.onStartCommand(intent, flags, startId); //销毁 @Override public void onDestroy() { super.onDestroy();

这里写图片描述

这里写图片描述


startService:通过startService启动的服务,该服务所在的进程会变成服务进程

bindSevice:进程优先级不变,但是绑定的服务和activity同生共死

6.调用service的方法

你会发现,如果单纯的看startsevice和bindservice,其实区别不大,其实,bindservice有一个用处就是可以调用service的方法,本身来看的话,你是无法吊桶service的方法的,因为你服务是启动起来的,你不能new,所以这里就要用上bindservice了,我们新建一个TwoService,并且写一个方法


这里,我们实现了一个中间回传,把这个方法给传出去,然后在MainActivity中,我们首先先启动这个服务


Intent i = new Intent(this,TwoService.class);

 //如果需要解绑的话就不能用匿名内部类

 bindService(i, new ServiceConnection() {

 @Override

 public void onServiceConnected(ComponentName name, IBinder service) {

 //就是返回的对象

 onclick = (TwoService.Onclick) service;

 @Override

 public void onServiceDisconnected(ComponentName name) {


当你以为这样就结束了,那就太不给力了,这里service里有些东西是不能对外提供的,java的思想还是来源于生活,所以我们要把他抽调成接口,我们新建一个接口