我正在编写一个监听传入短信的应用程序。所以我写了一个服务,为此启动了BroadcastReceiver。 该服务由我的应用程序启动,但当后者被销毁时,我的服务似乎没有听到任何内容。由于此服务的目的是侦听传入的SMS,因此必须“永久”运行(或因内存管理而重新启动)。
以下是一些代码:
public class SmsService extends Service {
private final static String TAG = SmsService.class.getSimpleName();
public static boolean SMS_SERVICE_STARTED = false;
private boolean mRegistered = false;
public final static String SMS_PORT = "port";
private SMSReceiver mSmsReceiver = null; // this is the BroadcastReceiver listening to SMS
public SmsService() {
super();
Log.d(TAG, "SmsService");
}
@Override
public void onCreate() {
Log.d(TAG, "onCreate");
SMS_SERVICE_STARTED = true;
}
@Override
public void onDestroy() {
Log.d(TAG, "onDestroy");
stopListenSms();
SMS_SERVICE_STARTED = false;
}
@Override
public IBinder onBind(Intent intent) {
Log.d(TAG, "onBind");
return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.d(TAG, "onStartCommand");
if (intent != null && intent.hasExtra(SMS_PORT)) {
Log.d(TAG, "we got extra!");
short port = intent.getShortExtra(SMS_PORT, (short) 0);
startListenSms(port);
} else {
Log.d(TAG, "no extra :(");
}
return START_STICKY;
}
private void startListenSms(short port) {
Log.d(TAG, "startListenSms on port " + port);
mSmsReceiver = new SMSReceiver();
IntentFilter filter = new IntentFilter(
"android.intent.action.DATA_SMS_RECEIVED");
filter.addDataScheme("sms");
String strPort = String.valueOf(port);
filter.addDataAuthority("localhost", strPort);
registerReceiver(mSmsReceiver, filter);
mRegistered = true;
}
private void stopListenSms() {
Log.d(TAG, "stopListenSms");
if (mSmsReceiver != null) {
if (mRegistered)
unregisterReceiver(mSmsReceiver);
mSmsReceiver = null;
}
}
}
我观察到它的活动被销毁时,使用null Intent调用onStartCommand。 你知道为什么我的服务在活动被销毁时停止生活吗? 我该如何让它“永远”运行?
提前致谢, 欢呼声。
答案 0 :(得分:5)
为什么需要运行服务来收听传入的短信。广播接收器本身用于此目的,一旦您在注册接收器时在意图过滤器中配置,它将继续监听传入消息。有大量的例子广播接收器和短信收听。请仔细阅读这些示例并有效地构建代码
答案 1 :(得分:0)
服务也有生命周期,可以由系统终止。虽然您可以将服务置于前台,但是您可以将此服务置于前台,这使得系统更难以终止它。尽管如此,它仍然是可能的;服务不能永远运行。查看服务的生命周期:http://developer.android.com/reference/android/app/Service.html#ServiceLifecycle
你需要的是一个侦听短信意图的BroadcastReceiver(我不确切地知道它是哪一个)。 BroadcastReceiver可以注册某些意图(例如,接收SMS)并且在系统发送这样的意图时启动。见http://developer.android.com/reference/android/content/BroadcastReceiver.html