2010-06-02 145 views
9

我已经看到了几个如何实现BroadCastReceiver的例子,但我应该如何实现一个服务,必须对一些待处理的Intent(例如来电)作出反应...... 其实我很想知道但是在一个活动中。但是在一个活动中,你显然有一个扩展服务或活动的类,所以它不能扩展BroadCastReceiver ... 看起来我们不能制作“平台感知”服务和/或工作之外的活动?服务和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 2010-06-02 16:45:20

4

您可以创建一个内部类

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

该类会收到事件,你可以传递到主处理器,或者只是调用一些外部方法

+0

它是否需要成为内部类? – n611x007 2013-10-30 11:47:04

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

在这种情况下非常简单。