【问题标题】:Service and a BroadCastReceiver服务和广播接收器
【发布时间】:2010-06-02 14:47:04
【问题描述】:

我已经看到了几个如何实现 BroadCastReceiver 的示例,但是我应该如何实现一个必须对一些待处理的 Intent(例如来电)做出反应的服务...... 实际上我想知道同样的“问题”但是在一个活动中.. 您显然有一个扩展服务或活动的类),因此它也不能扩展广播接收器... 看起来我们无法制作“平台感知”服务和/或 Activties?

【问题讨论】:

    标签: android service android-activity broadcastreceiver


    【解决方案1】:

    要注册活动以接收特定意图,您需要:

    // Flag if receiver is registered 
    private boolean mReceiversRegistered = false;
    
    // I think this is the broadcast you need for something like an incoming call
    private String INCOMING_CALL_ACTION = "android.intent.action.PHONE_STATE";
    
    // Define a handler and a broadcast receiver
    private final Handler mHandler = new Handler();
    private final BroadcastReceiver mIntentReceiver = new BroadcastReceiver() {
      @Override
      public void onReceive(Context context, Intent intent) {
        // Handle reciever
        String mAction = intent.getAction();
    
        if(mAction.equals(INCOMING_CALL_ACTION) {
          // Do your thing   
        }
    }
    
    @Override
    protected void onResume() {
      super.onResume();
    
      // Register Sync Recievers
      IntentFilter intentToReceiveFilter = new IntentFilter();
      intentToReceiveFilter.addAction(INCOMING_CALL_ACTION);
      this.registerReceiver(mIntentReceiver, intentToReceiveFilter, null, mHandler);
      mReceiversRegistered = true;
    }
    
    @Override
    public void onPause() {
      super.onPause();
    
      // Make sure you unregister your receivers when you pause your activity
      if(mReceiversRegistered) {
        unregisterReceiver(mIntentReceiver);
        mReceiversRegistered = false;
      }
    }
    

    然后您还需要在清单中添加一个意图过滤器:

     <activity android:name=".MyActivity" android:label="@string/name" >
       <intent-filter> 
         <action android:name="android.intent.action.PHONE_STATE" /> 
       </intent-filter>
     </activity>
    

    【讨论】:

    • 如果您创建一个新的 BroadcastReceiver 实例,然后在您的代码中注册它以提供一个意图过滤器对象,您无需在清单文件的活动定义中创建
    【解决方案2】:

    你可以创建一个内部类

    class A extends Activity {
     BroadcastReceiver r = new BroadcastReceiver(){
       // code to handle broadcase
     }
    }
    

    该类将接收事件,您可以将其传递给主处理程序,或者只是调用一些外部方法

    【讨论】:

    • 必须是内部类吗?
    【解决方案3】:

    实际上,您只需将监听器添加到 TelephonyManager 即可对来电做出反应

    您在 Service/Activity 中定义 PhoneStateListener

    private PhoneStateListener mPhoneStateListener = new PhoneStateListener() {
    
        @Override
        public void onCallStateChanged(int state, String incomingNumber) {
            super.onCallStateChanged(state, incomingNumber);
    
            switch (state) {
            case TelephonyManager.CALL_STATE_OFFHOOK:
                         break;
            case TelephonyManager.CALL_STATE_RINGING:
                         break;
            case TelephonyManager.CALL_STATE_IDLE:
                         break;
            }
        }
    
    };
    

    然后在onCreate方法中:

    mTelephonyManager = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
    mTelephonyManager.listen(mPhoneStateListener, PhoneStateListener.LISTEN_CALL_STATE);
    

    最后你清除了 onDestroy 中的监听器:

    mTelephonyManager.listen(mPhoneStateListener, PhoneStateListener.LISTEN_NONE);
    

    在这种情况下要简单得多。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-06
      • 1970-01-01
      • 1970-01-01
      • 2012-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多