2012-02-01 289 views
74

我试图在Service内启动BroadcastReceiver。我想要做的是有一个后台运行service去收集传入的短信,并记录来电。我想最好的办法是运行一个service,它包含一个可以编目的广播接收器。服务内的广播接收器

我该如何去做这件事?我已经启动并运行了我的服务。

回答

106

为您服务已经安装,只需在您的服务中添加广播接收器:在

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

和你很好去接收广播的东西ver在onStartCommand中提到过滤器。确保在需要时添加任何权限。例如,

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

我想显示吐司消息而来电呼叫。我加了这个filter.addAction(“android.provider.Telephony.LISTEN_CALL_STATE”);那么如何做吐司。 – Prasad 2014-08-05 16:23:06

+0

我发现在发送sendBroadcas(意图)和braoadcastReceiver在这种情况下不起作用时,我无法通过intent.setData(myUri)传递数据,是吗? – deadfish 2014-11-15 19:18:03

+0

我有点迷惑服务生命周期时,它有BroadcastReceiver(在我的情况下载BroadcastReceiver) – 2015-02-05 05:13:18

23

更好的模式是创建一个独立的BroadcastReceiver。这可以确保您的应用可以响应广播,无论是否运行Service。实际上,使用这种模式可以完全消除对恒定运行Service的需要。

在您的Manifest中注册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(); 
    } 
} 
+3

我希望广播处于服务的生命周期内,以便应用程序仅根据服务时间线查询邮件/电话。这个方法是否启用了这个功它看起来像你已经设置好了,所以广播的接收启动了服务。 – Utopia025 2012-02-05 03:54:19

+0

如果它尚未运行,则此实现将启动“服务”,或者如果它是(通过'onStartCommand'中的检索)则传递一个新的“Intent”。如果你只希望它在'Service'处于活动状态时运行,你可以通过'PackageManager'的'setComponentEnabledSetting()'以编程方式启用/禁用'Receiver'组件。 – 2012-02-05 04:24:17

+3

Waqas的答案可能是你最好的选择,如果你只希望在'Service'正在运行时'Receiver'活着。 – 2012-02-05 04:27:50