2017-09-10 55 views
5

Uygulamamda, IntentService kullanarak arka planda kısa bir ağ isteğini kesen bir bildirim düğmem var. Burada bir GUI göstermenin bir anlamı yok, bu yüzden bir Etkinlik yerine hizmeti kullanıyorum. Aşağıdaki kodlara bakın.JobIntentService'ın PendingIntent'ten (Bildirim düğmesi) başlatılması?

// Build the Intent used to start the NotifActionService 
Intent buttonActionIntent = new Intent(this, NotifActionService.class); 
buttonActionIntent.setAction(NotifActionService.ACTION_SEND_CONFIRM); 
buttonActionIntent.putExtra(NotifActionService.EXTRA_CONFIRM_ID, confirmId); 
buttonActionIntent.putExtra(NotifActionService.EXTRA_NOTIF_ID, notifId); 

// Build the PendingIntent used to trigger the action 
PendingIntent pendingIntentConfirm = PendingIntent.getService(this, 0, buttonActionIntent, PendingIntent.FLAG_UPDATE_CURRENT); 

Bu güvenilir ama bana yerine JobIntentService taşımak istediğiniz yapılan Android 8.0 yeni arka plan kısıtlamalar ile çalışır. Servis kodunun güncellenmesi çok doğru görünüyor ancak Bildirim İşlemi'nin gerektirdiği bir PendingIntent ile nasıl başlatacağımı bilmiyorum.

Bunu nasıl başarabilirim?

Normal bir servise gidip PendingIntent.getForegroundService (...) API düzeylerinde 26+ ve geçerli kod API 25 ve sonraki sürümlerde kullanmak daha iyi olur mu? Bu wakelocks, iş parçacığı el ile işlemek ve Android 8.0+ üzerinde çirkin bir bildirim ile sonuçlanmasını gerektirir.

DÜZENLEME: Aşağıda, IntentService öğesinin JobIntentService'ye düz ileri dönüşümü yanında sona erdiğim kod yer almaktadır. sadece benim JobIntentService için niyet sınıfını değiştirir ve enqueueWork yöntemini çalıştırır

BroadcastReceiver:

public class NotifiActionReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     intent.setClass(context, NotifActionService.class); 
     NotifActionService.enqueueWork(context, intent); 
    } 
} 
orijinal kod

Modifiye sürümü:

// Build the Intent used to start the NotifActionReceiver 
Intent buttonActionIntent = new Intent(this, NotifActionReceiver.class); 
buttonActionIntent.setAction(NotifActionService.ACTION_SEND_CONFIRM); 
buttonActionIntent.putExtra(NotifActionService.EXTRA_CONFIRM_ID, confirmId); 
buttonActionIntent.putExtra(NotifActionService.EXTRA_NOTIF_ID, notifId); 

// Build the PendingIntent used to trigger the action 
PendingIntent pendingIntentConfirm = PendingIntent.getBroadcast(this, 0, buttonActionIntent, PendingIntent.FLAG_UPDATE_CURRENT); 

cevap

9

Nasıl bunu başarabilir ?

bir BroadcastReceiver ve getBroadcast()PendingIntent, o zaman alıcı olan onReceive() metoda JobIntentServiceenqueueWork() yöntemi aramasını kullanın. Bunu denemediğimi itiraf edeceğim, ama AFAIK çalışmalı.

+0

Evet, bu işe yarayabilir. Bir cevap vereceğim ve cevabımın hem eski hem de eski platformlardaki sorunumu gerçekten çözdüğünden emin olduktan sonra cevabınızı kabul edeceğim. – blunden

+0

Başarılı oldunuz mu? Ve eğer evet ise, lütfen bir örnek gönderir misiniz? THX – tomseitz

+0

@tomseitz Henüz denemedim, ancak şu ana kadar diğer değişikliklere odaklandım. Bu noktada Android O’yu hedeflemekten pek fazla faydalanamıyorum. Bunu yapmak istediğim şey daha çok, çünkü en son sürümü hedeflemeyi seviyorum. Aynı sorunu yaşıyor musunuz? – blunden