我试图在Service
内启动BroadcastReceiver
。我想要做的是有一个后台运行service
去收集传入的短信,并记录来电。我想最好的办法是运行一个service
,它包含一个可以编目的广播接收器。服务内的广播接收器
我该如何去做这件事?我已经启动并运行了我的服务。
我试图在Service
内启动BroadcastReceiver
。我想要做的是有一个后台运行service
去收集传入的短信,并记录来电。我想最好的办法是运行一个service
,它包含一个可以编目的广播接收器。服务内的广播接收器
我该如何去做这件事?我已经启动并运行了我的服务。
为您服务已经安装,只需在您的服务中添加广播接收器:在
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" />
更好的模式是创建一个独立的BroadcastReceiver
。这可以确保您的应用可以响应广播,无论是否运行Service
。实际上,使用这种模式可以完全消除对恒定运行Service
的需要。
在您的Manifest中注册BroadcastReceiver
,并为其创建一个单独的类/文件。
如:
<receiver android:name=".FooReceiver" >
<intent-filter >
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
</receiver>
当接收器运行时,您只需通过一个Intent
(Bundle
)到Service
,并在onStartCommand()
回应。
例如:
public class FooReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// do your work quickly!
// then call context.startService();
}
}
我希望广播处于服务的生命周期内,以便应用程序仅根据服务时间线查询邮件/电话。这个方法是否启用了这个功它看起来像你已经设置好了,所以广播的接收启动了服务。 – Utopia025 2012-02-05 03:54:19
如果它尚未运行,则此实现将启动“服务”,或者如果它是(通过'onStartCommand'中的检索)则传递一个新的“Intent”。如果你只希望它在'Service'处于活动状态时运行,你可以通过'PackageManager'的'setComponentEnabledSetting()'以编程方式启用/禁用'Receiver'组件。 – 2012-02-05 04:24:17
Waqas的答案可能是你最好的选择,如果你只希望在'Service'正在运行时'Receiver'活着。 – 2012-02-05 04:27:50
我想显示吐司消息而来电呼叫。我加了这个filter.addAction(“android.provider.Telephony.LISTEN_CALL_STATE”);那么如何做吐司。 – Prasad 2014-08-05 16:23:06
我发现在发送sendBroadcas(意图)和braoadcastReceiver在这种情况下不起作用时,我无法通过intent.setData(myUri)传递数据,是吗? – deadfish 2014-11-15 19:18:03
我有点迷惑服务生命周期时,它有BroadcastReceiver(在我的情况下载BroadcastReceiver) – 2015-02-05 05:13:18