6

Ayrıca, bildirim çubuğunda bulunan ve aynı zamanda iptal edilebilen dosyaların birden çok kez indirilmesini de istiyorum.Özel Android İndirme Hizmeti - dosya başına ilerleme bildirimi satırı sağlama

Özel bir Hizmet uyguladım, birden çok karşıdan yüklemeyi AsyncTasks kullanarak paralel olarak gerçekleştirir. OnPublishProgress Her dosya için indirme ilerlemesini göstermek için bildirim çubuğundaki tek tek satırları güncellemeye çalışıyorum. İki katı gün boyunca, yanıp sönen satırlarla, sorunları değiştirerek ve bazen sadece boş kalırken veya yalnızca bir satırı güncelleştirerek sorunları çözmeye çalışıyorum. Ayrıca, rutini iptal etmek için sıraya dokunmak her zaman işe yaramaz.

protected void showProgressNotification(final File item, int progress, boolean isDownloading) { 
    String message = null; 
    int smallIcon = 0; 
    Bitmap largeIcon = null; 
    int flags = 0; 
    flags |= Notification.FLAG_ONGOING_EVENT; 
    //flags |= Notification.FLAG_FOREGROUND_SERVICE; 
    //flags |= Notification.FLAG_ONLY_ALERT_ONCE; 
    //flags |= Notification.FLAG_AUTO_CANCEL; 

    NotificationCompat.Builder builder = 
      new NotificationCompat.Builder(getApplicationContext()); 
    builder.setAutoCancel(true); 

    if (progress == 100) { 
     largeIcon = BitmapFactory.decodeResource(getResources(), 
       O2FolderListAdapter.getIconForItem(item, false)); 
     smallIcon = R.drawable.ic_cloud_upto_date; 

     if (isDownloading) { 
      message = "Download completed. Tap to clear."; 
     } else { 
      message = "Upload completed. Tap to clear."; 
     } 
    } else if (progress >= 0) { 
     largeIcon = BitmapFactory.decodeResource(getResources(), 
       O2FolderListAdapter.getIconForItem(item, true)); 
     if (isDownloading) { 
      smallIcon = R.drawable.ic_cloud_downloading; 
      message = "Downloading: " + progress + "%. Tap to cancel."; 
     } else { 
      smallIcon = R.drawable.ic_cloud_uploading; 
      message = "Uploading: " + progress + "%. Tap to cancel."; 
     } 
     builder.setProgress(100, progress, false); 
    } else { 
     largeIcon = BitmapFactory.decodeResource(getResources(), 
       O2FolderListAdapter.getIconForItem(item, true)); 
     smallIcon = R.drawable.ic_cloud_conflict; 
     if (isDownloading) 
      message = "Cancelled download. Tap to clear."; 
     else 
      message = "Cancelled upload. Tap to clear."; 
    } 

    if (mResultIntent == null) { 
     mResultIntent = new Intent(getApplicationContext(), CustomDownloadService.class); 
     mResultIntent.addFlags(Notification.FLAG_ONGOING_EVENT); 
    } 
    mResultIntent.putExtra("cancel", item.getPath().hashCode()); 
    Log.d("O2AbstractDownloadService", "Setup task id " + item.GetPath().hashCode()); 
    if (mContentIntent == null) 
     mContentIntent = PendingIntent.getService(getApplicationContext(), PI_REQ_CODE, mResultIntent, PendingIntent.FLAG_UPDATE_CURRENT); 
    builder.setContentIntent(mContentIntent); 

    builder.setLargeIcon(largeIcon); 
    builder.setSmallIcon(smallIcon); 
    builder.setContentTitle(item.GetName()); 
    builder.setContentText(message); 

    //if (progress != 100) 
     //builder.addAction(R.drawable.ic_action_dark_cancel, "Cancel", contentIntent); 

    final Notification notification = builder.build(); 
    notification.flags = flags; 
    notification.defaults = Notification.DEFAULT_LIGHTS; 

    NotificationManager mNotificationManager = 
     (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); 
    // Id allows you to update the notification later on. 
    //mNotificationManager.notify(item.getPath().hashCode(), notification); 
    //startForeground(item.getPath().hashCode(), notification); 

    // only update notification every 100ms (unless cancel or complete) 
    long notificationDelay = 100; 
    long now = System.currentTimeMillis(); 
    if (mFutureCallTime == 0 || now > mFutureCallTime || progress == -1 || progress == 100) { 
     startForeground(item.getPath().hashCode(), notification); 
      //mNotificationManager.notify(item.GetPath().hashCode(), notification); 
    } else 
     Log.d("CustomDownloadService", "Called too often to notification"); 

    mFutureCallTime = now + notificationDelay; 
} 

yüzden indirme işlemini iptal etmek dosyanın id geçen bildirim dokunarak zaman Hizmetlerini aramanız kurulum için harekete çalışıyorum:

İşte benim kodudur. Neyi yanlış yaptığımı gören var mı? Neyin peşinde olduğum şey mümkün mü? Bir Xoom tabletinde, bildirimler çok fazla titremeye başlar, ancak Nexus 7'de sık sık rastlanmaz. Tüm cihazlar sürekli olarak satırları değiştirir ve bu da istediğiniz indirme işlemini iptal etmenin neredeyse imkansız olduğu anlamına gelir.

Her türlü öneri çok takdir edilecektir.

GÜNCELLEME 1: bu benim sorunlardan biri neden olabilecek düşünüyorum: Android Service.startForeground does NOT respect notification id uniqueness

GÜNCELLEME 2: değiştirerek sorunu builder.setWhen (fixedTime) çağırarak giderilmiştir. Açıkçası, yeni dateTime, satırların her yenilendiğinde yeniden sıralanmasına neden oluyordu. Sadece Xoom'da ve “İptal Etmek için Dokun” özelliğindeki titremeyi düzeltmeniz gerekiyor.

UPDATE 3: Xoom'daki titreme, aramaların yenilenmesini sınırlandırarak giderildi. Sonunda kod, bildirimin 100 msn'den daha önce güncellenmesini engeller. Kalan konular iptal etmekle ilgilidir. İptal edilecek musluk ilk kez çalışır, ancak sonraki dosyalar üzerinde çalışmaz. Ayrıca satırları temizleyemiyorum.

UPDATE 4: Tek iptal etme sorunu, sonuç alanında sınıf düzeyinde olmanın nedeni idi. Bildirimi yenilediğimde her defasında yeni bir tane oluşturduğumda, kimlikler bağlandı. Ayrıca bayrağı yalnızca Notification.FLAG_ONLY_ALERT_ONCE olarak değiştirdim ve sadece .notify() ve startForeground() öğelerini kullanmıyorum.

+0

Yani tüm sorunlar şimdi giderildi mi? Öyleyse, lütfen kendi cevabınızı gönderin ve ileride başvurmak üzere kabul edilmiş olarak işaretleyin! Thnx – Entreco

cevap

1

Tüm sorunlar giderildi. Güncellemeleri orijinal gönderiimde ekledim. Özet: 1) Builder.setWhen (fixedTime) konusunda dikkatli olun. 2) Her 100 ms'de bir kereden fazla yenilemeyin 3) Doğru bayrakları ayarlayın.

+1

Yenileme, herhangi bir bildirimin ölümüne neden olabilir. İşte arada sırada güncellemek için kullanılabilecek birkaç yöntem: http://stackoverflow.com/questions/16050381/how-do-i-get-an-android-service-to-broadcast-an-intent-every-few- saniye –

İlgili konular