服务不会活着

时间:2013-01-28 21:44:11

标签: android service

我正在编写一个监听传入短信的应用程序。所以我写了一个服务,为此启动了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。 你知道为什么我的服务在活动被销毁时停止生活吗? 我该如何让它“永远”运行?

提前致谢, 欢呼声。

2 个答案:

答案 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