服务中的广播接收器


90

我正在尝试BroadcastReceiver在内启动Service。我正在尝试做的是后台运行service,该后台会收集传入的短信并记录传入的电话。我想最好的解决方法是让service跑步机上装有可以编目的广播接收机。

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

Answers:


127

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

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" />

我已经注意到我在发送sendBroadcas(intent)时无法通过intent.setData(myUri)传递数据,并且braoadcastReceiver在这种情况下不起作用,对吗?
死鱼2014年

我对服务生命周期有点迷惑当它有广播接收器(在我的情况下载广播接收器)
Android的人

1
@waqaslam您是否在清单中设置了此BroadcastReceiver?
IgorGanapolsky'2

2
@IgorGanapolsky不,您不需要在清单中注册此类接收者。
waqaslam 2015年

2
@SayyedRizwan您的服务和BroadcastReceiver将在同一进程和最可能在同一线程下运行(除非您创建一个新线程)。电池消耗取决于您如何定义线程(背景/前景)以及
传入

24

更好的模式是创建一个独立的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();
    }   
}

6
我希望广播在服务的生命周期之内,以便该应用仅根据服务时间线查询消息/电话。这种方法能做到吗?好像您已经设置好了,因此广播的接收会取消该服务。
Utopia025 '02

Service如果尚未运行,则此实现将启动,如果尚未运行,则传递一个新的Intent(用于检索onStartCommand)。如果你只希望它运行的时候Service是活的,你可以以编程方式启用/禁用Receiver通过组件PackageManagersetComponentEnabledSetting()
保罗·伯克

4
如果仅ReceiverService运行时希望存活,Waqas的答案可能是您的最佳选择。
保罗·伯克

3
如果您没有活动,则该活动将不适用于API 3.1和更高版本:ashimita.blogspot.com.tr/2012/04/…–
elif

1
从Android 3.1开始,如果用户从未启动过相应的应用程序,或者用户通过Android菜单明确停止了该应用程序,则默认情况下,Android系统会将所有接收者排除在接收意图之外。vogella.com/tutorials/AndroidBroadcastReceiver/article.html
Juraj Petrik
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.