OnStartCommand'de geçirilen Intent'in NULL olmasının nedenleri


100

onStartCommand(Intent, int, int)Sistemin hizmeti bir bayrak aracılığıyla yeniden başlatmasının yanı sıra , iletilen NULL olmasının başka bir nedeni var mı START_STICKY?

Ayrıca, hizmet sistem tarafından yeniden başlatıldığında, Intent.getAction()yöntem bazen NULL ... döndürür. Amaç NULL değil sadecegetAction()

Ben de burada sordum ama henüz bir cevap almadım.

GÜNCELLEME : Mark Murphy ile sohbet ettikten sonra ben dönmek önerdi START_REDELIVER_INTENTiçinde onStartCommand()yerine Hizmetimde callback'inde START_STICKYtüm niyet yeniden başlatılmasının ardından gönderilir böylece.

Bunu başlangıçta yapmadım çünkü hizmet bir şey yapmaya çalışıyorsa, o zaman bunun ortasında hizmetin yeniden başlatıldığından ... bunu yapmaya başladığının farkına varacak mı? Sanırım bu mantıkla sorumlu olmam gerekecek :)


16
Sorunuzu yanıtla düzenlemek yerine, lütfen bir yanıt ekleyin ve kabul edin, böylece sorunuz Yanıtlanmamış sorular grubunda görünmeyi bırakacaktır - teşekkürler.
Dale Wilson

2
Sadece benzer sorunu olan biri için bir not. Ben hata alıyorum genelde bulmuşlardır intentolduğu nullüzerinde onStartCommand(), bu daha önce LogCat görülebilir diğer bazı hatası nedeniyle oluşur. Nedenini bilmiyorum ama gözlemlediğim şey buydu ve gözden kaçırmak oldukça kolay.
Piotr Chojnacki

2
@DaleWilson Yapardım ama bu soru gerçekten çözülmedi. START_REDELIVER_INTENT kullanmaya başvurmadan bir Niyetin neden geçersiz olduğuna veya boş bir niyetten nasıl kaçınılacağına dair kesin bir yanıt alana kadar (ki bu daha sonra ihtiyacım olan şey değildi, ancak yine de bazı kişilerin sorunlarını çözecek, bu yüzden düzenlememi bıraktım) Bir cevabı kabul edemiyorum.
rf43

@Mosquito Özellikle neyin hata verdiğini fark ettiniz mi?
rf43

1
@DDoSAttack Gerçekten önemli değil. Benim durumumda, örneğin NullPointerExceptionEtkinliklerden birinde bir yerdeydi. Daha sonra başka bir hataydı. Bu hata oluştu ederken koşuyordu - - vardı ama her iki durumda da benim yığın izleme benim hizmet olduğunu gösterdi intentolduğunu nullda olduğu gibi. Uzun zamandır neyin yanlış olduğunu düşünüyordum, yığın izini yukarı kaydırmaya karar verdiğimde ve en tepede bir yerde gerçek hatamı aldığım ortaya çıktı. Bunu çözdükten sonra null intentkaybolan da.
Piotr Chojnacki

Yanıtlar:


51

Gelen bayraklarla ilgili bir tartışma olmamasına şaşırdım. Bunu günlüklerde aşağıdakilerle izleyeceğim:

if (null == intent || null == intent.getAction ()) {
        String source = null == intent ? "intent" : "action";
        Log.e (TAG, source + " was null, flags=" + flags + " bits=" + Integer.toBinaryString (flags));
        return START_STICKY;
}

Güncelleme: Bayraklar 0 idi, bu yüzden orada eyleme geçirilebilir hiçbir şey yoktu. Hiçbir işlev kaybı olmadan orada boş onay bıraktım.

Düzenleme: Tamam, bunu her yerde START_STICKY belgesinde buldum! "Hizmete teslim edilecek bekleyen herhangi bir başlatma komutu yoksa, boş bir amaç nesnesiyle çağrılacaktır, bu yüzden bunu kontrol etmeye özen göstermelisiniz.

http://developer.android.com/reference/android/app/Service.html


7
KOTLIN içinde, niyet değil-boş olarak işaretlenir ve bu uygulamayı çöküyoroverride fun onStartCommand(intent: Intent, flags: Int, startId: Int): Int {}
Muhammed Naderi

@MuhammadNaderi sadece niyet edebilirsiniz Intent?. Benim için çalıştı. Ama tabii ki boş amacı doğru bir şekilde işlemeniz gerekir.
Patrick Boos

@PatrickBoos But then of course you need to correctly handle null intent; Ne demek istiyorsun?! Nasıl? Teşekkürler.
Dr.jacky

Sadece kodunuzda onStartCommand(intent: Intent?, ...)çalışmasını sağlamak istedim . Ve sonra yapmayın intent!!ama amacın boş olup olmadığını kontrol edin.
Patrick Boos
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.