3.9 采用代码的方式动态注册广播接收者

两种广播接受者注册的优缺点:

1. 清单文件注册.
一旦应用程序被部署到手机上, 立刻生效了.
不管应用程序的进程是否开启,接收到了广播事件后,立刻执行onReceive()方法.


2. 代码注册
只有执行了 registerReceiver(receiver, filter); 生效

执行  unregisterReceiver(receiver);  失效

我们可以手工的控制这个广播接受者的有效期. 




需求:广播接收者的有效周期与服务的生命周期相关联,当服务开启时广播开启,当服务结束时广播结束

实现:1.在服务类中创建一个类继承BroadcastReceiver,并重写未实现方法
2.在服务开启的时候注册并开启广播
3.在服务销毁的时候取消广播


-----------------------------------------------------------------------------------------------

1.在服务类中创建一个类继承BroadcastReceiver,并重写未实现方法
 
 
 
 
 
2.在服务开启的时候注册并开启广播
 
 
 
3.在服务销毁的时候取消广播
 
 
/**
 * 来电时显示来电号码归属地的服务
 *   @author   Administrator
 *
 */
public   class   ShowAddressService   extends   Service {

         private   TelephonyManager    tm ;
         private   MyListener   listener ;
         private   BroadcastReceiver    receiver ;
      
       @Override
       public   IBinder onBind(Intent intent) {
            
               return   null ;
      }
      
      
       /**
       * 代码的方式创建广播接收者
       */
       private   class   OutCallReceiver    extends   BroadcastReceiver{

               @Override
               public   void   onReceive(Context context, Intent intent) {
                  
                  String address = AddressDao.getAddress(getResultData(), context);
                  Toast. makeText(context, address, 1).show();
         
            }
            
      
      }
      
      
      
      
      
      
       /**
       * 服务创建的时候
       */
       @Override
       public   void   onCreate() {
          super .onCreate();
       
          //在服务创建时注册并开启广播
          receiver = new   OutCallReceiver();
        IntentFilter  filter=   new   IntentFilter();
        filter.addAction(   "android.intent.action.NEW_OUTGOING_CALL"   );
          this .registerReceiver(   receiver , filter);
       
           //创建电话管理者
          tm =(TelephonyManager) getSystemService(   TELEPHONY_SERVICE );
          listener =   new   MyListener();    //初始化MyListener()
      
          //注册一个监听器,监听电话状态的改变
          tm .listen( listener , PhoneStateListener.   LISTEN_CALL_STATE );
       
       
       
      }
      
       /**
       * 服务销毁的时候
       */
       @Override
       public   void   onDestroy() {
       super .onDestroy();
      
            //在服务销毁时结束广播
            unregisterReceiver(   receiver );
               receiver   =   null ;
         
               // 当服务停止的时候 取消电话监听
               tm .listen(   listener , PhoneStateListener.   LISTEN_NONE );
               listener   =   null ;
      
      }
      
      
      
      
       /**
       * 电话状态的监听器
       *
       */
       public   class   MyListener    extends   PhoneStateListener{
            
               @Override
               public   void   onCallStateChanged(   int   state, String incomingNumber) {
                     super .onCallStateChanged(state, incomingNumber);
                  
                     switch   (state) {
                     case   TelephonyManager.   CALL_STATE_IDLE :     //空闲状态
                        
                           break ;

              case   TelephonyManager.   CALL_STATE_RINGING   //响铃状态
                  
                     //响铃时获取来电号码得到号码归属地
                  String location = AddressDao.getAddress(incomingNumber, getApplicationContext());
                  Toast. makeText(getApplicationContext(), location, 1).show();
                  
                        
                           break ;
                        
              case   TelephonyManager. CALL_STATE_OFFHOOK :     //接听状态
                        
                           break ;      
                        
                  }
                  
                  
                  
            }
            
            
      }
      
      

}








 
 
 
 
 
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值