服务和BroadCastReceiver

TiG*_*Ger 9 service android broadcastreceiver android-activity

我已经看到了几个如何实现BroadCastReceiver的例子,但是我应该如何实现一个必须对一些待处理的Intent做出反应的服务(例如来电)...实际上我想知道同样的"问题"但是在活动..你显然有一个扩展服务或活动的类)所以它也不能扩展BroadCastReceiver ...看起来我们不能制作"平台感知"服务和/或活动?

m6t*_*6tt 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;
  }
}
Run Code Online (Sandbox Code Playgroud)

然后,您还需要为清单添加一个intent-filter:

 <activity android:name=".MyActivity" android:label="@string/name" >
   <intent-filter> 
     <action android:name="android.intent.action.PHONE_STATE" /> 
   </intent-filter>
 </activity>
Run Code Online (Sandbox Code Playgroud)

  • 如果您创建一个新的BroadcastReceiver实例,然后在提供意图过滤器对象的代码中注册它,则无需在清单文件的活动定义中创建<intent-filter>. (15认同)