着信 SMS をリッスンするアプリケーションを作成しています。そこで、そのために 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;
}
}
}
そのアクティビティが破棄されると、onStartCommand が null インテントで呼び出されることがわかりました。アクティビティが破棄されると、なぜ私のサービスが停止するのか分かりますか? そして、それを「永久に」実行するにはどうすればよいですか?
前もってありがとう、乾杯。