Запуск сервисной активности, которая может выполняться после завершения загрузки

У меня есть приложение со службой, зарегистрированной в AndroidManifest для запуска во время загрузки. Я делаю это через Intent Receiver для BOOT_COMPLETED, и это работает нормально. Однако, если пользователь запускает приложение сразу после установки, я бы хотел запустить службу из моей основной деятельности, поскольку она может быть не запущена.

Я не уверен, что это лучший способ сделать это. Я знаю, что могу вызвать startService() из действия, и это работает, но тогда у меня может быть запущено несколько экземпляров службы. Я не хочу сначала останавливать службу, потому что если она работает, я просто хочу, чтобы этот экземпляр продолжал работать. Служба может быть в середине задачи, и я не хочу, чтобы она останавливалась.

В действии:

Intent serviceIntent = new Intent();
serviceIntent.setAction(MessageReceiverService.ClassName);
startService(serviceIntent);

Android Manifest регистрирует намерение:

<receiver android:name="com.app.proto1.service.StartupIntentReceiver" >
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED" />

        <category android:name="android.intent.category.HOME" />
    </intent-filter>
</receiver>

Методы перегрузки моей службы:

@Override
public IBinder onBind(Intent arg0) {
    // TODO Auto-generated method stub
    return null;
}

@Override
public void onCreate() {
    super.onCreate();

    Log.d(Tag, "onCreate()");
}

@Override
public void onDestroy() {
    super.onDestroy();
    Log.d(Tag, "onDestroy()");
}

@Override
public void onStart(Intent intent, int startId) {

    super.onStart(intent, startId);     
    Log.d(Tag, "onStart()");
    this.registerReceiver(new SmsReceiver(), new IntentFilter(SMS_ACTION));
}   

Есть ли способ проверить, запущена ли служба, и не запускать ее снова, и не уничтожая существующую?


person Stealth Rabbi    schedule 28.09.2012    source источник
comment
В отличие от действий, не существует нескольких экземпляров служб. Моя основная деятельность запускает мою службу точно так же, с той же целью. Вы должны быть готовы.   -  person jsmith    schedule 28.09.2012


Ответы (1)


Хорошо, если ваша служба уже запущена, и вы пытаетесь снова запустить службу, для службы не будет создан новый экземпляр, он будет рассматривать только предыдущий запущенный экземпляр. Так что в таком случае беспокоиться не о чем. Если вы вызовете Службу во время ее работы, будет вызвана ее onStartCommand(Intent, int, int), а не onCreate().

person Lalit Poptani    schedule 28.09.2012
comment
Хорошо, я регистрировал широковещательный приемник в моей перегрузке Service.onStart(), а не в onCreate(). Да, глядя на журналы, я вижу, что onCreate() вызывается только один раз, даже после нескольких вызовов startService(). Кажется, я хочу зарегистрировать приемник вещания в методе службы onCreate(), а не в onStart(). Хорошая сделка, спасибо. - person Stealth Rabbi; 28.09.2012
comment
Также onStart() устарел, поэтому лучше использовать onStartCommand() - person Lalit Poptani; 28.09.2012
comment
Ааа, спасибо. Я, должно быть, вытащил довольно старый пример службы. - person Stealth Rabbi; 28.09.2012