博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Service之来电监听(失败的案例)
阅读量:4332 次
发布时间:2019-06-06

本文共 3202 字,大约阅读时间需要 10 分钟。

Service:服务,可以理解成一个运行再后台没有界面的Activity,集成于Seriver,是四大组件之一

Service的继承关系:Service-->ContextWrapper-->Context  (与activity一样,都继承与ContextWrapper);

 

生命周期:Context.startSeriver() 方法开启服务:onCreate()-->onStartCommand()-->onDestory();

    第一次开启服务,服务会执行onCreate()-->onStartCommand();(开启之后再开启服务,不会执行onCreate()方法);

     Context.bindSeriver() 方法开启服务:onCreate()-->onBind()-->onUnbind()-->重载的方法返回true-->Rebind()-->onDestory();

 

开启

   方式一:startService();

   方式二:bindService();

停止:

  方式一:stopService();

  方式二:unBind();

 

下面开始我们的来电监听:

实现创建一个类继承与Seriver:

 

1 public class MyService extends Service { 2     //创建一个录音机的实例 3     MediaRecorder recorder = null; 4     //绑定服务 5     @Nullable 6     @Override 7     public IBinder onBind(Intent intent) { 8         return null; 9     }10 11     //解绑服务12     @Override13     public void unbindService(ServiceConnection conn) {14         super.unbindService(conn);15     }16 17     //重新绑定服务18     @Override19     public void onRebind(Intent intent) {20         super.onRebind(intent);21     }22 23     //创建一个Service 第一次开启的时候24     @Override25     public void onCreate() {26         Log.i("wei","onCreate");27         TelephonyManager tm = (TelephonyManager)getSystemService(TELEPHONY_SERVICE);28         tm.listen(new MyPhoneStateSeriverListener(),PhoneStateListener.LISTEN_CALL_STATE);29         super.onCreate();30 31     }32 33     @Override34     public int onStartCommand(Intent intent, int flags, int startId) {35         Log.i("wei","onStartCommand");36         return super.onStartCommand(intent, flags, startId);37     }38 39     @Override40     public void onDestroy() {41         super.onDestroy();42         Log.i("wei","onDestroy");43     }44     private class MyPhoneStateSeriverListener extends PhoneStateListener{45         @Override46         public void onCallStateChanged(int state, String incomingNumber) {47             switch (state){48                 case TelephonyManager.CALL_STATE_IDLE://空闲状态49                     if (recorder!=null){50                         recorder.stop();51                         recorder.reset();52                         recorder.release();53                     }54                     break;55                 case TelephonyManager.CALL_STATE_OFFHOOK://接听状态56                     recorder.start();//开始录音57                     break;58                 case TelephonyManager.CALL_STATE_RINGING://响铃状态59                     recorder.setAudioSource(MediaRecorder.AudioSource.VOICE_CALL);//设置音频的来源  MIC只能录单方的,VOICE_CALL可以录双方的60                     recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);//设置音频的输出格式61                     recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);//设置音频的编码方式62                     recorder.setOutputFile("/mnt/sdcard/luyin.3gp");//设置录音文件的存储位置63                     try {64                         recorder.prepare();//准备录音65                     } catch (IOException e) {66                         e.printStackTrace();67                     }68                     break;69             }70             super.onCallStateChanged(state, incomingNumber);71         }72     }73 }

 

Manifest.xml配置:

1 
2
3

 

报错,空指针异常。

 

   

转载于:https://www.cnblogs.com/Godfunc/p/6036743.html

你可能感兴趣的文章
hdu2089:不要62(基础数位dp)
查看>>
Tools
查看>>
JS获取第二个横杠后面的内容
查看>>
excel 导入MYSQL
查看>>
P3038 [USACO11DEC]牧草种植Grass Planting
查看>>
23 个最有吸引力和免费的Flash图像轮廓
查看>>
给label添加点击事件
查看>>
eterna 第一个案例
查看>>
新部署到服务器 报 The requested URL /home/profession was not found on this server. 错误
查看>>
hadoop从非HA转到NAMENODE HA时需要注意的一个问题
查看>>
KnockoutJs学习笔记(十一)
查看>>
访问修饰符public、private、protect、default范围
查看>>
jQuery实现布局高宽自适应
查看>>
《学习》10函数的建立与使用
查看>>
去除TB二合一页面弹窗
查看>>
托管和非托管的区别。
查看>>
win7与VMware ubuntu虚拟机实现文件共享(最后一定要装open-vm-dkms插件)
查看>>
Java 集合知识总结(三)
查看>>
文件类型解析漏洞防御与攻击(PHP)
查看>>
初步认识AutoMapper转载 https://www.cnblogs.com/fred-bao/p/5700776.html
查看>>