2013-06-30 24 views
8

i bir hizmet e-posta gönderir (EmailService) ... benim app e-posta göndermek için gereken her zaman yarattık, bustartplanground için birden fazla çağrı var mı?

... hizmetini başlatır ve bir niyet yoluyla e-postanın kimliği geçmesi i Onu öldürmek ve e-posta gönderme durumunu kullanıcıya bildirmek için startforeground(id_of_email, mynotifcation); kullanıyorum.

Kullanıcıya o anda birden çok e-posta göndermesine izin vermem gerekiyor, bu yüzden kullanıcının başka bir e-posta göndermesi gerektiğinde, startservice numaralı telefonu yeni bir niyetle (farklı e-posta adresi) çağırır ... böylece startforeground(new_id_of_email, mynotifcation); numaralı telefonu tekrar arar .

sorun startforeground için yeni çağrı ... önceki bildirim üzerine yazar (böylece kullanıcının önceki bildirim kaybeder ve daha önceki e-posta ile neler olduğunu bilmiyor) Service.startForeground() baktığımızda

+0

Veritabanındaki görevleri sıraya koymak daha iyi olmaz mı? Bu şekilde, ilk yapıldıktan sonra hizmet, bunu yapmak veya silmek için güncellenir ve yapılacak başka bir şey olup olmadığını kontrol eder. Belki hizmeti daha fazla görevle beslemeye devam etmek için bir mesaj – eduyayo

cevap

2

olmasıdır Kaynak, startForeground'a yapılan çoklu çağrıların yalnızca o anda gösterilen bildirimin yerini alacağını gösterir. Aslında, StartForeground çağrısı, her zaman true olarak ayarlanmış olan removeNotification ayarıyla stopForeground() ile aynıdır.

Devam eden her e-posta için bir bildirim görüntülemek üzere servis isteğinde bulunmak isterseniz, her bildirimi hizmetten ayrı ayrı yönetmeniz gerekir.

public final void startForeground(int id, Notification notification) { 
    try { 
     mActivityManager.setServiceForeground(
       new ComponentName(this, mClassName), mToken, id, 
       notification, true); 
    } catch (RemoteException ex) { 
    } 
} 

public final void stopForeground(boolean removeNotification) { 
    try { 
     mActivityManager.setServiceForeground(
       new ComponentName(this, mClassName), mToken, 0, 
       null, removeNotification); 
    } catch (RemoteException ex) { 
    } 
} 

http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.3_r1/android/app/Service.java#Service.startForeground%28int%2Candroid.app.Notification%29

0

biri de STOP_FOREGROUND_DETACH bayrağı kullanabilirsiniz. stopForeground (int) API seviyesi 24 int STOP_FOREGROUND_DETACH Bayrak ilave

STOP_FOREGROUND_DETACH

: documentation den teklif

halinde grubu, bildirim daha önce startForeground sağlanan (int Bildirimi) hizmetten ayrılacaktır. Sadece STOP_FOREGROUND_REMOVE ayarlanmadığında anlamlıdır - bu durumunda, bildirim gösterilmeye devam eder, ancak hizmetten tamamen ayrılır ve artık bildirim yöneticisine doğrudan yapılan aramalar haricinde artık değiştirilmemiştir.

Sabit Değer: 2 (0x00000002)

Yani, startForeground() bir tekrarlanan çağrı önce stopForeground(STOP_FOREGROUND_DETACH); çağırabilir. Bu, bildirimi kaldıracak ve startForeground() numaralı telefona yapılan değişiklikler, numaralı telefon için farklı bir bildirim kimliği kullanıyorsa, değiştirmeyecektir. Dahası, "müstakil" bildirimi, şimdi, "devam eden hizmet" i temsil etmemektedir ve bu nedenle kullanıcı tarafından bir tokatlamak suretiyle çıkarılabilmektedir.

bonus: here belgelendirilmiştir

uyumluluğu, bir ServiceCompat.stopForeground(MyService.this, STOP_FOREGROUND_DETACH)ServiceCompat sınıfı ve static yöntemi kullanabilir.

İlgili konular