服务中的广播接收器

时间:2012-02-01 07:10:02

标签: android sms broadcastreceiver android-service

我正在尝试在BroadcastReceiver内启动Service。我要做的是让后台运行service,收集传入的短信,并记录来电。我认为最好的方法是运行service,其中包含可以编目的广播接收器。

我该怎么做呢?我已经启动并运行了我的服务。

2 个答案:

答案 0 :(得分:118)

由于您的服务已经设置,只需在您的服务中添加广播接收器:

private final BroadcastReceiver receiver = new BroadcastReceiver() {
   @Override
   public void onReceive(Context context, Intent intent) {
      String action = intent.getAction();
      if(action.equals("android.provider.Telephony.SMS_RECEIVED")){
        //action for sms received
      }
      else if(action.equals(android.telephony.TelephonyManager.ACTION_PHONE_STATE_CHANGED)){
           //action for phone state changed
      }     
   }
};

在您的服务中onCreate执行此操作:

IntentFilter filter = new IntentFilter();
filter.addAction("android.provider.Telephony.SMS_RECEIVED");
filter.addAction(android.telephony.TelephonyManager.ACTION_PHONE_STATE_CHANGED);
filter.addAction("your_action_strings"); //further more
filter.addAction("your_action_strings"); //further more

registerReceiver(receiver, filter);

并在您的服务中onDestroy

unregisterReceiver(receiver);

并且您很高兴接收广播,以了解您在onCreate中提及的内容。如果需要,请务必添加任何权限。例如。

<uses-permission android:name="android.permission.RECEIVE_SMS" />

答案 1 :(得分:22)

更好的模式是创建一个独立的BroadcastReceiver。这可以确保您的应用可以响应广播,无论Service是否正在运行。实际上,使用此模式可能无需一直运行Service

在您的清单中注册BroadcastReceiver,并为其创建单独的类/文件。

例如:

<receiver android:name=".FooReceiver" >
    <intent-filter >
        <action android:name="android.provider.Telephony.SMS_RECEIVED" />
    </intent-filter>
</receiver>

当接收者运行时,您只需将IntentBundle)传递给Service,然后在onStartCommand()中对其进行回复。

例如:

public class FooReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        // do your work quickly!
        // then call context.startService();
    }   
}