广播接收机内的服务
我正在尝试在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>
当接收器运行时,只需将一个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(); } }