一:通过广播接收者启动服务
例如,系统收到开机的广播后启动服务
<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;
}
}