Android实训案例七四大组件之一Service初步了解实现通话录音功能抽调接口Word格式文档下载.docx
《Android实训案例七四大组件之一Service初步了解实现通话录音功能抽调接口Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《Android实训案例七四大组件之一Service初步了解实现通话录音功能抽调接口Word格式文档下载.docx(18页珍藏版)》请在冰豆网上搜索。
/**
*我的服务
*Createdbylglon16/4/10.
*/
publicclassMyServiceextendsService{
@Override
publicIBinderonBind(Intentintent){
returnnull;
}
}
记得要注册哦
serviceandroid:
name="
.MyService"
/>
好了,我们现在来看看怎么启动,其实跟activity一模一样
caseR.id.startservice:
Intenti=newIntent(this,MyService.class);
//启动服务
startService(i);
break;
我们启动之后就可以在后台看到
这里我们可以看到有一个服务
2.停止服务
停止服务就相对来讲很简单了,首先我们定义一个Button
@+id/stopservice"
停止服务"
然后就可以手动停止了
caseR.id.stopservice:
Intentintent=newIntent(this,MyService.class);
//停止服务
stopService(intent);
这样就停止了
3.声明周期
用一张图表示,毕竟天天看Activity的生命周期,这个看懂不是难事
publicintonStartCommand(Intentintent,intflags,intstartId){
returnsuper.onStartCommand(intent,flags,startId);
publicvoidonCreate(){
super.onCreate();
publicvoidonDestroy(){
super.onDestroy();
这里不多做介绍
4.通话录音机
我们来写个小案例,就是用service监听通话,录音之后保存下来,我們在button中启动这个service,然后在service中一创建,我们就获取电话状态
@Override
getService();
publicvoidgetService(){
//服务一创建就监听
TelephonyManagertm=(TelephonyManager)getSystemService(TELEPHONY_SERVICE);
tm.listen(newmyListener(),PhoneStateListener.LISTEN_CALL_STATE);
classmyListenerextendsPhoneStateListener{
//电话状态改变的回调
publicvoidonCallStateChanged(intstate,StringincomingNumber){
super.onCallStateChanged(state,incomingNumber);
//判断当前的状态
switch(state){
//电话空闲
caseTelephonyManager.CALL_STATE_IDLE:
Log.i("
myListener"
"
电话空闲"
);
//电话响铃
caseTelephonyManager.CALL_STATE_RINGING:
电话响铃"
//正在通话
caseTelephonyManager.CALL_STATE_OFFHOOK:
电话通话"
这里隐私授权,需要权限哦
<
uses-permissionandroid:
android.permission.READ_PHONE_STATE"
那我们先来调试一下,我们点击启动服务
现在我们可以在响铃就开始准备录音资源了
//判断硬件是否支持录音
if(recorder==null){
getRecorder();
录音方法
/**
*通话录音
privatevoidgetRecorder(){
recorder=newMediaRecorder();
//麦克风
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(IOExceptione){
e.printStackTrace();
这里准备好了之后,我们只要接通了就开始录音
if(recorder!
=null){
//开始录音
recorder.start();
当我们挂断电话,电话状态重新回到空闲的时候就停止并且释放资源
//停止录音
recorder.stop();
//释放资源
recorder.release();
recorder=null;
我们来测试一下,我们拨打一个电话,状态是这样的
我们去目录下翻一翻
这里,可以看到有一个audio.3gp说明我们录音成功了
完整代码
MyService
importandroid.media.MediaRecorder;
importandroid.telephony.PhoneStateListener;
importandroid.telephony.TelephonyManager;
importjava.io.IOException;
*电话录音
//录音
privateMediaRecorderrecorder;
*获取电话状态
5.Service的两种启动方式
servic启动有两种方式,我们来比对一下。
我们写一个新建一个项目ServiceTwo
activity_main.xml
?
xmlversion="
1.0"
encoding="
utf-8"
>
LinearLayoutxmlns:
android="
xmlns:
tools="
match_parent"
gravity="
center"
orientation="
vertical"
@+id/btn_start"
@+id/btn_stop"
@+id/btn_bind"
绑定服务"
@+id/btn_unbind"
解除绑定"
/LinearLayout>
MainActivity
packagecom.lgl.servicetwo;
importandroid.content.ComponentName;
importandroid.content.ServiceConnection;
importandroid.support.v7.app.AppCompatActivity;
importandroid.os.Bundle;
importandroid.view.View;
importandroid.widget.Button;
publicclassMainActivityextendsAppCompatActivityimplementsView.OnClickListener{
privateButtonbtn_start,btn_stop,btn_bind,btn_unbind;
privateMyConnnn;
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
conn=newMyConn();
privatevoidinitView(){
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);
publicvoidonClick(Viewv){
switch(v.getId()){
caseR.id.btn_start:
startService(newIntent(this,OneService.class));
caseR.id.btn_stop:
stopService(newIntent(this,OneService.class));
caseR.id.btn_bind:
bindService(newIntent(this,OneService.class),conn,BIND_AUTO_CREATE);
caseR.id.btn_unbind:
unbindService(conn);
*服务回调
classMyConnimplementsServiceConnection{
//到服务的连接被建立了
publicvoidonServiceConnected(ComponentNamename,IBinderservice){
//到服务的连接中断了
publicvoidonServiceDisconnected(ComponentNamename){
关于服务里面
OneService
publicclassOneServiceextendsService{
//绑定
//解绑
publicbooleanonUnbind(Intentintent){
returnsuper.onUnbind(intent);
//创建
//开始
//销毁
这里就不赘述了,启动的对应方法,我们通过上面的分析出区别来
startService:
通过startService启动的服务,该服务所在的进程会变成服务进程
bindSevice:
进程优先级不变,但是绑定的服务和activity同生共死
6.调用service的方法
你会发现,如果单纯的看startsevice和bindservice,其实区别不大,其实,bindservice有一个用处就是可以调用service的方法,本身来看的话,你是无法吊桶service的方法的,因为你服务是启动起来的,你不能new,所以这里就要用上bindservice了,我们新建一个TwoService,并且写一个方法
//服务方法
publicvoidisShow(){
System.out.print("
我是服务里的一个方法"
这个button启动
@+id/btn_isshow"
调用方法"
TwoService
importandroid.os.Binder;
publicclassTwoServiceexten