2012-02-13 17 views
6

Hizmetimin "kilitlendikten" sonra otomatik olarak ActivityManager tarafından yeniden başlatılmasını engellemenin bir yolu var mı? Bazı senaryolarda, hizmet program çıkışında zorla öldürüyorum, ancak Android'in yeniden başlatılmasını istemiyorum.Android: Hizmetin çökme sonrasında yeniden başlatılması nasıl önlenir?

+1

Servisinizin iskelet uygulamanızı gösterin. –

+0

Düzenli bir Hizmet mi yoksa Bir Amaç Hizmeti mi? –

cevap

1

Hizmetiniz SharedPreferences'a bir değer kaydedebilir. Örneğin, hizmetiniz her başladığında böyle bir şey depolayabilirsiniz: mağaza ("serviceStarted", 1);

Hizmetiniz düzenli olarak sona erdiğinde (bunu yapmak için bir ileti gönderirseniz) bu değeri geçersiz kılarsınız: store ("serviceStarted", 0);

Hizmetiniz bir dahaki sefer yeniden başladığında, serviceStarted değerinin "1" olduğunu algılar - bu, hizmetinizin düzenli olarak durdurulduğu ve kendini yeniden başlattığı anlamına gelir. Bunu tespit ettiğinizde servisiniz arayabilir: stopSelf(); kendini iptal etmek. Daha fazla bilgi için

: Bu davranış sizin Service uygulanmasında onStartCommand() dönüş değeri ile tanımlanır http://developer.android.com/reference/android/app/Service.html#ServiceLifecycle

30

. Sabit START_NOT_STICKY, işlem "öldürüldüğünde" çalışıyorsa Android'in hizmeti yeniden başlatmamasını söyler. Başka bir deyişle:

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
    // We don't want this service to continue running if it is explicitly 
    // stopped, so return not sticky. 
    return START_NOT_STICKY; 
} 

HTH

+3

Kabul edilen çözüm olarak işaretlenmemiş olsa da, bu doğru yanıttır – scooterman

+0

Olağanüstü amaçlar varsa işe yaramaz. Bu problemim var ve yukarıdaki yaklaşım işe yaramıyor. Aşağıdaki yaklaşım belki daha iyi bir alternatif olabilir ama henüz uygulamaya koymadım. Yığın taşmasında önerilen diğer yaklaşımları denediniz, ancak henüz başaramadılar. –

+0

@BrianReinhold, bu soruda belirli bir dönüşe sahip gibi görünüyor, kullanım durumunuzu ve gözlemlediğiniz sorunları açıkladığınızdan birini yayınladınız mı? Daha çok ilgilenmek isterim. – Devunwired

5

Burada başkası yardımcı olabilecek Ben durumda ile geldi çözüm. Uygulamam hala START_NOT_STICKY ile yeniden başlatıldı. Bunun yerine, hizmetin sistem tarafından yeniden başlatıldığı anlamına gelen null amacını kontrol ediyorum.

@Override 
public int onStartCommand(@Nullable Intent intent, int flags, int startId) { 
    // Ideally, this method would simply return START_NOT_STICKY and the service wouldn't be 
    // restarted automatically. Unfortunately, this seems to not be the case as the log is filled 
    // with messages from BluetoothCommunicator and MainService after a crash when this method 
    // returns START_NOT_STICKY. The following does seem to work. 
    Log.v(LOG_TAG, "onStartCommand()"); 
    if (intent == null) { 
     Log.w(LOG_TAG, "Service was stopped and automatically restarted by the system. Stopping self now."); 
     stopSelf(); 
    } 
    return START_STICKY; 
} 
+0

Teşekkürler !. Sık sık konum güncellemeleri alma ve sunucudan hizmete gönderme zorunluluğum vardı. bildirime dayalı ön plan hizmeti, ancak uygulama kapatıldığında yer güncellemelerini almayı durdurdu, 2 gün süren mücadeleden sonra, cevabınıza ulaştım ve kodunuzu değiştirdim. 'StopSelf()' den önce, aynı servisin yeniden başlatılmasını "AlarmManager" ile şimdilik 10sec gecikme.Ve, bu çok iyi çalıştı, şimdi sürekli servisten konum güncellemeleri almak. Çok teşekkürler! – manoj

İlgili konular