广播接收机内的服务

我正在尝试在Service启动BroadcastReceiver 。 我想做的是有一个后台运行的service去收集传入的短信,并logging来电。 我认为最好的方法就是运行一个可以编录目录的广播接收器。

我怎么去做这个? 我已经有了我的服务了。

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

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

并且你很乐意接收onStartCommand中提到的filter。 确保如果需要添加任何权限。 例如

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

更好的模式是创build一个独立的BroadcastReceiver 。 这可以确保您的应用程序可以响应广播,无论Service是否正在运行。 实际上,使用这种模式可以完全消除对一个持续运行Service

在您的Manifest中注册BroadcastReceiver ,并为其创build一个单独的类/文件。

例如:

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