通过广播接收者(BroadcastReceiver)或守护线程启动服务,录音机监听电话

一:通过广播接收者启动服务

例如,系统收到开机的广播后启动服务

<receiver android:name="com.mycompany.mysimple.ListenPhoneService.BootReceiver">
            <intent-filter >
                <action android:name="android.intent.action.BOOT_COMPLETED"/>
            </intent-filter>
        </receiver>
public class BootReceiver extends BroadcastReceiver {

	@Override
	public void onReceive(Context context, Intent intent) {
		/**
		 * 当开机开机完成时,广播接收者接收到开机完成的广播,此时开启服务
		 */
		Intent myInt = new Intent(context, PhoneServer.class);
		context.startService(myInt);
	}

}


二:守护线程启动服务

当Service1被销毁时启动Service2,Service2被销毁时启动Service1;可以将Service1和Service2做成一样的功能,就避免了用户在设置中停止服务时的操作。
例如,通过录音机监听用户电话的例子
/**
 * Created by Administrator on 2015/8/24.
 * 这个案例说白了就是startService()和stopService()两个方法;
 * 然后就是service的onCreate(),onStartCommand(),onDestroy()方法。
 * 然后就是创建录音机监听电话的状态。
 * 还有守护线程。
 */
public class PhoneMainActivity extends Activity {


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_phonemain);
    }
    /**
     * 开启服务
     */
    public void start1(View v){
        Intent intent=new Intent(this,PhoneServer.class);
        startService(intent);
    }
    /**
     * 停止服务
     */
    public void stop1(View v){
        Intent intent=new Intent(this, PhoneServer.class);
        stopService(intent);
    }
    /**
     * 开启服务
     */
    public void start2(View v){
        Intent intent=new Intent(this,PhoneServer2.class);
        startService(intent);
    }
    /**
     * 停止服务
     */
    public void stop2(View v){
        Intent intent=new Intent(this, PhoneServer2.class);
        stopService(intent);
    }
}
public class PhoneServer extends Service {
	private TelephonyManager tm ;
	private MyListener listener;
	private MediaRecorder mediaRecorder=null;
	@Override
	public IBinder onBind(Intent intent) {
		return null;
	}
	/**
	 * 创建服务
	 */
	@Override
	public void onCreate() {
		System.out.println("开始创建1号服务");
		//创建一个电话管理器
		tm = (TelephonyManager) this.getSystemService(TELEPHONY_SERVICE);
		//给电话管理器设置监听器和要监听的事件
		listener=new MyListener();
		tm.listen(listener, PhoneStateListener.LISTEN_CALL_STATE);//
	}
	/**
	 * 创建一个监听器继承PhoneStateListener
	 */
	private class MyListener extends PhoneStateListener{

		@Override
		public void onCallStateChanged(int state, String incomingNumber) {
			try {
				switch (state) {
					case TelephonyManager.CALL_STATE_IDLE://空闲状态
						System.out.println("空闲状态");
						//如果状态变为空闲则停止录音
						//一开始监听到的就是空闲状态,此时mediaRecorder为null,由通话状态切换过来时才不为null
						if(mediaRecorder!=null){
							//8:停止录音
							mediaRecorder.stop();
							//9:释放资源
							mediaRecorder.release();
							mediaRecorder=null;
							System.out.println("录音完成");
						}
						break;
					case TelephonyManager.CALL_STATE_RINGING://响铃状态
						System.out.println("响铃状态");
						break;
					case TelephonyManager.CALL_STATE_OFFHOOK://通话状态
						/**
						 * 开始录音
						 */
						//1:创建一个录音机
						mediaRecorder = new MediaRecorder();
						//2:给录音机设置声音源
						mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);//拨号方的声音
						//3:给输出文件设置输出格式
						mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);//默认
						//4:设置输出文件的名称
						File file=new File(Environment.getExternalStorageDirectory(), System.currentTimeMillis()+".3gp");
						mediaRecorder.setOutputFile(file.getAbsolutePath());
						//5:设置输出文件的编码
						mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);//默认编码
						//6:准备录音
						mediaRecorder.prepare();
						//7:开始录音
						mediaRecorder.start();
						break;
					default:
						break;
				}
			} catch (Exception e) {
				System.out.println("出现异常");
				e.printStackTrace();
			}
		}

	}
	/**
	 * 启动服务
	 */
	@Override
	public int onStartCommand(Intent intent, int flags, int startId) {
		System.out.println("1号服务接收到启动的指令");
		return super.onStartCommand(intent, flags, startId);
	}

	/**
	 * 销毁服务
	 */
	@Override
	public void onDestroy() {
		System.out.println("销毁1号服务");
		//启动守护线程
		Intent intent=new Intent(this, PhoneServer2.class);
		startService(intent);
		//停止监听
		tm.listen(listener, PhoneStateListener.LISTEN_NONE);
		listener=null;
	}

}
public class PhoneServer2 extends Service {
	private TelephonyManager tm ;
	private MyListener listener;
	private MediaRecorder mediaRecorder=null;
	@Override
	public IBinder onBind(Intent intent) {
		return null;
	}
	/**
	 * 创建服务
	 */
	@Override
	public void onCreate() {
		System.out.println("开始创建2号服务");
		//创建一个电话管理器
		tm = (TelephonyManager) this.getSystemService(TELEPHONY_SERVICE);
		//给电话管理器设置监听器和要监听的事件
		listener=new MyListener();
		tm.listen(listener, PhoneStateListener.LISTEN_CALL_STATE);//
	}
	/**
	 * 创建一个监听器继承PhoneStateListener
	 */
	private class MyListener extends PhoneStateListener{

		@Override
		public void onCallStateChanged(int state, String incomingNumber) {
			try {
				switch (state) {
					case TelephonyManager.CALL_STATE_IDLE://空闲状态
						System.out.println("空闲状态");
						//如果状态变为空闲则停止录音
						//一开始监听到的就是空闲状态,此时mediaRecorder为null,由通话状态切换过来时才不为null
						if(mediaRecorder!=null){
							//8:停止录音
							mediaRecorder.stop();
							//9:释放资源
							mediaRecorder.release();
							mediaRecorder=null;
							System.out.println("录音完成");
						}
						break;
					case TelephonyManager.CALL_STATE_RINGING://响铃状态
						System.out.println("响铃状态");
						break;
					case TelephonyManager.CALL_STATE_OFFHOOK://通话状态
						/**
						 * 开始录音
						 */
						//1:创建一个录音机
						mediaRecorder = new MediaRecorder();
						//2:给录音机设置声音源
						mediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);//拨号方的声音
						//3:给输出文件设置输出格式
						mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.DEFAULT);//默认
						//4:设置输出文件的名称
						File file=new File(Environment.getExternalStorageDirectory(), System.currentTimeMillis()+".3gp");
						mediaRecorder.setOutputFile(file.getAbsolutePath());
						//5:设置输出文件的编码
						mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);//默认编码
						//6:准备录音
						mediaRecorder.prepare();
						//7:开始录音
						mediaRecorder.start();
						break;
					default:
						break;
				}
			} catch (Exception e) {
				System.out.println("出现异常");
				e.printStackTrace();
			}
		}

	}
	/**
	 * 启动服务
	 */
	@Override
	public int onStartCommand(Intent intent, int flags, int startId) {
		System.out.println("2号服务接收到启动的指令");
		return super.onStartCommand(intent, flags, startId);
	}


	/**
	 * 销毁服务
	 */
	@Override
	public void onDestroy() {
		System.out.println("销毁2号服务");
		//启动守护线程
		Intent intent=new Intent(this, PhoneServer.class);
		startService(intent);
		//停止监听
		tm.listen(listener, PhoneStateListener.LISTEN_NONE);
		listener=null;
	}

}






  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值