2010-06-02 6 views
9

Я видел несколько примеров того, как реализовать BroadCastReceiver, но как мне реализовать Сервис, который должен реагировать на некоторые ожидающие намерения (например, входящий телефонный звонок) ... На самом деле мне было интересно одна и та же «проблема», но в действии. . У вас, очевидно, есть класс, который расширяет Сервис или Активность), поэтому он не может также расширить BroadCastReceiver ... Похоже, что мы не можем использовать «поддерживаемые платформой» службы и/или Activties?Сервис и BroadCastReceiver

ответ

12

Для регистрации активности получить определенное намерение вам нужно:

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

, если вы создаете новый экземпляр BroadcastReceiver, а затем зарегистрируете его в своем коде, предоставляя объект фильтра намерения, который вам не нужен, чтобы создать <намерение-фильтр> в определении вашей деятельности в файле манифеста. – hara

4

вы можете создать внутренний класс

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

, что класс будет получать события, которые вы можете перейти к главному обработчиком, или просто называют некоторые внешние методы

+0

Требуется ли быть внутренним классом? – n611x007

4

На самом деле вы можете реагировать на входящий телефонный звонок, просто добавив слушателя 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); 

В этом случае намного проще.

Смежные вопросы