2010-06-02 22 views
9

Bir BroadCastReceiver uygulamasının nasıl gerçekleştirileceğine dair birkaç örnek gördüm, ancak bazı Bekleyen Amaçlara (örneğin gelen telefon çağrısına) tepki vermesi gereken bir Hizmeti nasıl uygulamalıyım? Aslında merak ettim Aynı "sorun" ancak bir Faaliyette .. Açıkça bir Hizmet veya Etkinlik genişleten bir sınıf var) bu yüzden BroadCastReceiver genişletemezsiniz ... "Platform farkında" hizmetleri yapamayız ve/veya activties?Service ve BroadCastReceiver

cevap

12

çağırabilir olayları alacak bir iç sınıfı

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

oluşturabilir

:

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

Sonra da Bildiriminize bir niyet-filtre eklemek gerekir: Eğer gerek

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

, yeni bir BroadcastReceiver örneği oluşturup daha sonra bir hedef süzgeç nesnesi sağlayarak kodunuza kaydettirirseniz, bildirim dosyasında etkinlik tanımınızda bir oluşturmanıza gerek yoktur. – hara

4

sınıf belirli niyet almaya Bir etkinliği kaydetmek için ana işleyicisi geçmek, ya da sadece bazı dış yöntemler

+0

İç sınıf olması gerekli mi? – n611x007

4

Aslında sadece/Etkinlik TelephonyManager

Sen Hizmet PhoneStateListener tanımlamak

dinleyicinin ekleyerek gelen aramaya tepki verebilir Sonra

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 yöntemde:

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

Sonunda dinleyiciyi onarıda temizlediniz:

mTelephonyManager.listen(mPhoneStateListener, PhoneStateListener.LISTEN_NONE); 

Bu durumda çok daha basit.

İlgili konular