Android 服务和广播接收器

Android 服务和广播接收器,android,service,android-activity,broadcastreceiver,Android,Service,Android Activity,Broadcastreceiver,我已经看到了几个如何实现BroadCastReceiver的示例,但是我应该如何实现一个必须对某些未决意图(例如来电)做出反应的服务。。。 事实上,我想知道同样的“问题”,但在一个活动中。。 显然,您有一个扩展服务或活动的类),因此它也不能扩展BroadCastReceiver。。。 看起来我们无法创建“平台感知”服务和/或活动?您可以创建一个内部类 class A extends Activity { BroadcastReceiver r = new BroadcastReceiver()

我已经看到了几个如何实现BroadCastReceiver的示例,但是我应该如何实现一个必须对某些未决意图(例如来电)做出反应的服务。。。 事实上,我想知道同样的“问题”,但在一个活动中。。 显然,您有一个扩展服务或活动的类),因此它也不能扩展BroadCastReceiver。。。
看起来我们无法创建“平台感知”服务和/或活动?

您可以创建一个内部类

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

该类将接收事件,您可以将其传递给主处理程序,或者只调用一些外部方法来注册活动以接收您需要的特定意图:

// 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>

实际上,只需将侦听器添加到TelephonyManager,您就可以对传入的电话作出反应

您可以在服务/活动中定义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);

在这种情况下就简单多了。

如果创建BroadcastReceiver的新实例,然后在代码中注册它,提供一个意图过滤器对象,则不需要在清单文件中的活动定义中创建。它需要是内部类吗?