目录
一、引言
在Android应用开发中,后台服务(Service)是实现持续运行任务的核心组件。本文将结合电话监听器的开发案例,深入讲解Service的运作机制,并演示如何通过TelephonyManager实现电话状态监控。本教程适用于已掌握Android基础知识的开发者。
二、Service核心机制解析
1. Service的本质特性
- 继承自Context的异步执行组件
- 无用户界面,支持后台运行(最长存活时间)
- 支持跨进程通信(AIDL)
2. 生命周期管理
启动方式 | 启动方法 | 终止方法 | 关联性 |
---|---|---|---|
启动式 | startService() | stopService()/stopSelf() | 独立运行 |
绑定式 | bindService() | unbindService() | 与组件共存 |
3. 服务类型全景
- 运行位置:
- 本地服务(Local Service)
- 远程服务(Remote Service)
- 运行模式:
- 前台服务(必须显示Notification)
- 后台服务
- 通信能力:
- 不可通信型
- 可通信型(通过Binder)
三、Service实战开发
1. 启动式Service开发(lesson1)
实现步骤:
1.继承Service类并重写关键方法
public class InfoService extends Service {
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// 后台任务逻辑
return START_STICKY;
}
}
2.在AndroidManifest.xml注册服务
<service android:name=".InfoService" />
3.通过Intent控制服务生命周期
// 启动服务
Intent startIntent = new Intent(context, InfoService.class);
startService(startIntent);
// 终止服务
Intent stopIntent = new Intent(context, InfoService.class);
stopService(stopIntent);
2. 绑定式Service开发
通信架构:
[Activity] ↔ [ServiceConnection] ↔ [Binder] ↔ [Service]
核心实现:
1.创建Binder子类
public class InfoBinder extends Binder {
public int getCount() {
return serviceCount;
}
}
2. 实现ServiceConnection
private ServiceConnection conn = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
InfoBinder binder = (InfoBinder) service;
int count = binder.getCount();
}
};
四、电话监听器完整实现(lesson3)
1. 系统架构设计
[监听界面] → [PhoneService] → [TelephonyManager]
↓
[录音管理]
2. 核心实现要点
TelephonyManager配置:
TelephonyManager tm = (TelephonyManager)getSystemService(TELEPHONY_SERVICE);
tm.listen(new PhoneStateListener(){
@Override
public void onCallStateChanged(int state, String number) {
switch(state) {
case CALL_STATE_RINGING:
// 响铃处理
break;
case CALL_STATE_OFFHOOK:
// 通话开始录音
startRecording();
break;
case CALL_STATE_IDLE:
// 挂断停止录音
stopRecording();
break;
}
}
}, LISTEN_CALL_STATE);
录音管理:
MediaRecorder recorder = new MediaRecorder();
private void startRecording() {
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
recorder.setOutputFile("/sdcard/call_record.3gp");
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
recorder.prepare();
recorder.start();
}
3. 必要权限声明
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
五、调试与优化技巧
- ADB调试命令:
adb shell ps | grep "system_server"
adb shell kill -9 [PID]
注意事项:
- 需动态申请运行时权限(API 23+)
- 录音文件建议添加时间戳命名
- 考虑不同Android版本的兼容性