Стартиране на сервизна дейност, която може да се изпълнява след завършване на зареждането

Имам приложение с услуга, регистрирана в AndroidManifest, за стартиране по време на зареждане. Правя това чрез Intent Receiver за BOOT_COMPLETED и това работи добре. Ако обаче потребителят стартира приложението веднага след инсталирането, бих искал да стартирам услугата от основната си дейност, тъй като тя може да не работи.

Не съм сигурен кой е най-добрият начин да направя това. Знам, че мога да извикам startService() от дейността и това работи, но след това мога да имам множество стартирани екземпляри на услугата. Не искам първо да спирам услугата, тъй като ако тя работи, просто искам този екземпляр да продължи да работи. Услугата може да е по средата на задача и не искам да спира.

В активност:

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

Намерение за регистриране на манифест на Android:

<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