2010-06-02 5 views
9

BroadCastReceiver를 구현하는 방법에 대한 몇 가지 예를 보았습니다. 그러나 보류중인 의도 (예 : 들어오는 전화)에 반응해야하는 서비스를 구현하는 방법은 무엇입니까? 사실 저는 궁금합니다 같은 "문제"가 아니라 활동에서. 분명히 BroadCastReceiver를 확장 할 수 없도록 서비스 또는 활동을 확장하는 클래스가 있습니다. "플랫폼 인식"서비스를 만들 수없는 것처럼 보입니다. 액티비티?서비스와 BroadCastReceiver

답변

12

를 호출 할 수있는 이벤트를 받게됩니다 내부 클래스

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

BroadcastReceiver의 새 인스턴스를 만든 다음 코드에 등록하여 인 텐트 필터 객체를 제공하는 경우 매니페스트 파일의 활동 정의에 <인 텐트 필터>를 만들 필요가 없습니다. – hara

4

당신은 클래스가 어떤 의도를받을 당신은 활동을 등록하려면 주 핸들러에 전달하거나 일부 외부 방법

+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); 

이 경우 훨씬 간단합니다.

관련 문제