2010-06-02 18 views
9

He visto varios ejemplos de cómo implementar un BroadCastReceiver, pero ¿cómo debo implementar un servicio que tiene que reaccionar a algún intento pendiente (por ejemplo, llamada entrante) ... En realidad, me preguntaba el mismo "problema", pero en una actividad .. Usted, evidentemente, tiene una clase que se extiende de un servicio o una actividad) por lo que no se puede extender también BroadcastReceiver ... parece que no podemos hacer que los servicios de "plataforma"-conscientes y/o Activties?Servicio y BroadCastReceiver

Respuesta

12

Para registrar una actividad para recibir una cierta intención es necesario:

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

a continuación, también tendrá que añadir un filtro a su intención manifiesta:

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

si crea una nueva instancia de BroadcastReceiver y luego lo registra en su código proporcionando un objeto de filtro de intención, no necesita crear un en su definición de actividad en el archivo de manifiesto. – hara

4

puede crear una clase interna

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

esa clase recibirá eventos, los cuales se pueden pasar al controlador principal, o simplemente llamar a algunos métodos exterior

+0

¿se requiere ser una clase interna? – n611x007

4

En realidad se puede reaccionar a la llamada telefónica entrante simplemente añadiendo oyente a TelephonyManager

Se define PhoneStateListener en su Servicio/Actividad

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; 
     } 
    } 

}; 

A continuación, en el método onCreate:

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

Finalmente borras al oyente en onDestroy:

mTelephonyManager.listen(mPhoneStateListener, PhoneStateListener.LISTEN_NONE); 

Mucho más simple en este caso.

Cuestiones relacionadas