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. @Override
  13. public void unbindService(ServiceConnection conn) {
  14. super.unbindService(conn);
  15. }
  16.  
  17. //重新绑定服务
  18. @Override
  19. public void onRebind(Intent intent) {
  20. super.onRebind(intent);
  21. }
  22.  
  23. //创建一个Service 第一次开启的时候
  24. @Override
  25. 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. @Override
  34. public int onStartCommand(Intent intent, int flags, int startId) {
  35. Log.i("wei","onStartCommand");
  36. return super.onStartCommand(intent, flags, startId);
  37. }
  38.  
  39. @Override
  40. public void onDestroy() {
  41. super.onDestroy();
  42. Log.i("wei","onDestroy");
  43. }
  44. private class MyPhoneStateSeriverListener extends PhoneStateListener{
  45. @Override
  46. 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. <uses-permission android:name="android.permission.RECORD_AUDIO"/>
  2. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
  3. <uses-permission android:name="android.permission.READ_PHONE_STATE" />

报错,空指针异常。

   

Service之来电监听(失败的案例)的更多相关文章

  1. Android来电监听和去电监听

    我觉得写文章就得写得有用一些的,必须要有自己的思想,关于来电去电监听将按照下面三个问题展开 1.监听来电去电有什么用? 2.怎么监听,来电去电监听方式一样吗? 3.实战,有什么需要特别注意地方? 监听 ...

  2. nodejs 80端口监听失败及NODE_PATH不起作用的问题

    nodejs做web服务器,打开80时报错:Error: listen EACCES 0.0.0.0:80 80端口监听失败,是因为1024以下的端口需要root权限,需要sudo或su之后执行.但这 ...

  3. android 呼入电话的监听(来电监听)转

    需要权限: <uses-permission android:name="android.permission.READ_PHONE_STATE" /> 方式一:通过广 ...

  4. ios应用来电监听

    先导入这两个头文件,库文件不用导可以 #import <CoreTelephony/CTCallCenter.h> #import <CoreTelephony/CTCall.h&g ...

  5. browser-sync 文件监听失败的解决方案

    问题 为了方便实时预览前端开发过程中修改源码后的页面,我在全球最大的同性交友网Github中找到了一个非常实用的工具,browser-sync. 安装使用方式请自行到官网https://browser ...

  6. 记一次使用 removeEventListener 移除事件监听失败的经历

    测试一 测试代码如下 var Test = function() { this.element = document.body; this.handler = function() { console ...

  7. Android来电监听

    本文实现来电自动接听,自动录音,自动回拨功能. public class MainActivity extends Activity { @Override protected void onCrea ...

  8. 第八章 watch监听 83 名称案例-使用watch监听文本框数据的变化

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8&quo ...

  9. 启动独立的tomcat服务器,没有自动创建ServletContext,对Context生命周期的监听失败

    1.可能web.xml文件里对ContextListener没有进行配置 2.web.xml文件有关对ContextListener的配置,出现了错误的单词拼写问题 比如 <listener&g ...

随机推荐

  1. 数据结构杂谈(二)简单有趣的地精排序Gnome sort

    很早之前便听说过地精排序的名字,今天自己看来一下,发现这是一种非常简单而且有趣的排序算法. 为什么叫地精排序? 地精排序在2000年由Dr. Hamid Sarbazi-Azad 提出的时候被称作 s ...

  2. 高性能MySQL笔记 第6章 查询性能优化

    6.1 为什么查询速度会慢   查询的生命周期大致可按照顺序来看:从客户端,到服务器,然后在服务器上进行解析,生成执行计划,执行,并返回结果给客户端.其中“执行”可以认为是整个生命周期中最重要的阶段. ...

  3. 通过url 下载文件

    1.问题简介 通过文件的url,将文件下载到本地.文件存储的位置为:tomcat服务器的文件夹(通过读取properties文件:可看:http://www.cnblogs.com/0201zcr/p ...

  4. NOIP2007矩阵取数[DP|高精度]

    题目描述 帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的n*m的矩阵,矩阵中的每个元素aij均为非负整数.游戏规则如下: 1.每次取数时须从每行各取走一个元素,共n个.m次后取完矩阵所有元素: 2. ...

  5. 通过Hander进行界面刷新

    Timer timer; TimerTask task; Handler handler;//先声明这3个变量 //在onCreate方法内 handler = new Handler(){ @Ove ...

  6. Quartz集群配置

    先看看quartz的持久化基本介绍: 引用 1 大家都清楚quartz最基本的概念就是job,在job内调用具体service完成具体功能,quartz需要把每个job存储起来,方便调度,quartz ...

  7. 用AutoCompleteTextView实现历史记录提示

    自定义AutoCompleteTextView 博客分类: android进阶 android  网上找到的都是同ArrayAdapter一起使用的,有时候需要自定义风格,咋办?follow me! ...

  8. jquery的工具方法isFunction/isArray/isWindow/isNumeric/isPlainObject/isEmptyObject

    isFunction : 是否函数 isArray : 是否数组 isWindow : 是否window isNumeric : 是否数字 type : 数据类型方法 isPlainObject : ...

  9. GNU Trove trove4j

    GNU Trove (http://trove4j.sourceforge.net/) 是一个Java 集合类库.在某些场景下,Trove集合类库提供了更好的性能,而且内存使用更少.以下是Trove中 ...

  10. PAT 1003. 我要通过!(20)

    "答案正确"是自动判题系统给出的最令人欢喜的回复.本题属于PAT的"答案正确"大派送 -- 只要读入的字符串满足下列条件,系统就输出"答案正确&quo ...