2010-06-02 5 views
9

J'ai vu plusieurs exemples d'implémentation d'un BroadCastReceiver, mais comment dois-je implémenter un service qui doit réagir à une intention en attente (par exemple un appel téléphonique entrant) ... En fait je me posais des questions sur le même "problème" mais dans une activité .. Vous avez évidemment une classe qui étend un service ou une activité) de sorte qu'il ne peut pas également étendre BroadCastReceiver ... Il semble que nous ne pouvons pas faire des services "platform-aware" et/ou Des activités?Service et un BroadCastReceiver

Répondre

12

Pour enregistrer une activité à recevoir une certaine intention vous devez:

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

Ensuite, vous aurez également besoin d'ajouter un filtre à votre intention manifeste:

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

Si vous créez une nouvelle instance de BroadcastReceiver puis l'inscrivez dans votre code en fournissant un objet filtre d'intention, vous n'avez pas besoin de créer un dans votre définition d'activité dans le fichier manifeste. – hara

4

vous pouvez créer une classe interne

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

cette classe recevra des événements, que vous pouvez passer au gestionnaire principal, ou tout simplement appeler des méthodes extérieures

+0

Faut-il être une classe interne? – n611x007

4

En fait, vous pouvez réagir à l'appel téléphonique entrant simplement en ajoutant l'auditeur à TelephonyManager

Vous définissez PhoneStateListener dans votre service/Activité

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

}; 

Puis dans la méthode onCreate:

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

Enfin, vous effacez l'écouteur dans onDestroy:

mTelephonyManager.listen(mPhoneStateListener, PhoneStateListener.LISTEN_NONE); 

Beaucoup plus simple dans ce cas.

Questions connexes