15

Tôi đang sử dụng lớp DownloadManager để tải xuống một cách có định dạng tệp. Tất cả các công trình tốt nhưng tôi không thể nhận được thông báo tải xuống hoàn thành để duy trì. Nó biến mất ngay lập tức sau khi quá trình tải xuống hoàn tất. Đây là mã của tôi:Tại sao thông báo "tải xuống hoàn tất" biến mất trên các thiết bị Gingerbread?

Request rqtRequest = new Request(Uri.parse(((URI) vewView.getTag()).toString())); 
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.ICE_CREAM_SANDWICH) { 
    rqtRequest.setShowRunningNotification(true); 
} else { 
    rqtRequest.setNotificationVisibility(Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED); 
} 
((DownloadManager) getSystemService(DOWNLOAD_SERVICE)).enqueue(rqtRequest); 

Tôi đã nhìn thấy một số câu hỏi trên web liên quan đến điều này nhưng tôi không thể tìm thấy giải pháp.

Trả lời

16

DownloadManager không hỗ trợ thông báo hoàn tất trên Gingerbread; bạn phải tự mình hiển thị nó.

Sử dụng một BroadcastReceiver to detect when the download finishes và hiển thị thông báo riêng bạn:

public class DownloadBroadcastReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     String action = intent.getAction(); 

     if (DownloadManager.ACTION_DOWNLOAD_COMPLETE.equals(action)) { 
      //Show a notification 
     } 
    } 
} 

và đăng ký nó trong biểu hiện của bạn:

<receiver android:name="com.zolmo.twentymm.receivers.DownloadBroadcastReceiver"> 
    <intent-filter> 
     <action android:name="android.intent.action.DOWNLOAD_COMPLETE"/> 
    </intent-filter> 
</receiver> 

Ngoài ra, setNotificationVisibility đã được bổ sung ở mức API 11 (Honeycomb) không ICS. Tôi không chắc chắn nếu bạn sử dụng hằng số ICS là cố ý hay không, nhưng bạn có thể thay đổi mã của bạn để sau đến việc sử dụng các thông báo hệ thống trên Honeycomb cũng như:

if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) { 
    rqtRequest.setShowRunningNotification(true); 
} else { 
    rqtRequest.setNotificationVisibility(Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED); 
} 
0

Bạn đang thử nghiệm phiên bản nào? Việc đặt VISIBILITY_VISIBLE_NOTIFY_COMPLETED sẽ đặt thông báo để nó chỉ hiển thị khi quá trình tải xuống hoàn tất. Nếu thông báo hiển thị trong khi tải xuống, thì tôi phải giả định rằng bạn đang chạy trên nền tảng trước ICS. Tôi sẽ gỡ lỗi ứng dụng. Đặt các điểm ngắt để xem lựa chọn "if" nào của bạn đang được thực thi.

+0

Trên ICS và các thiết bị mới hơn, thông báo hiển thị tốt - cả trong khi tải xuống và vẫn tồn tại sau khi tải xuống. Trên thiết bị Gingerbread và các thiết bị cũ hơn, nó hiển thị khi tải xuống nhưng biến mất khi hoàn tất. Không có tài liệu dành cho nhà phát triển nào về điều này. Tôi không thấy cần phải đặt breakpoint vì tôi đã cố gắng loại bỏ câu lệnh 'if' và chạy lệnh này trên trình mô phỏng Gingebread. Mã được thực hiện và thông báo xuất hiện khi tải xuống nhưng đó là nó. –

0

Có thể đó là cách thô lỗ (nhưng đơn giản): bạn có thể chỉ muốn tạo thông báo mới sau khi tải xuống xong PS: ah, và tôi xin lỗi, nó không thực sự là câu trả lời cho câu hỏi "tại sao", nhưng vẫn có thể hữu ích cho bạn

2

Bạn phải tạo riêng của bạn tải xuống thông báo đầy đủ cho Gingerbread.

Đầu tiên, có được một tài liệu tham khảo để tải về từ DownloadManager:

DownloadManager downloadManager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE); 
DownloadManager.Request request = new Request(someUri); 
//... 
long downloadReference = downloadManager.enqueue(request); 

Sau đó nghe cho dowload phát sóng hoàn toàn trong tùy chỉnh của bạn BroacastReceiver:

IntentFilter filter = new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE); 

BroadcastReceiver receiver = new BroadcastReceiver() { 
    @Override public void onReceive(Context context, Intent intent) { 
     long reference = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1); 
     if (downloadReference == reference) { 
       // Send your own notification 
     } 
    } 
}; 

registerReceiver(receiver, filter); 

và gửi đi riêng tải thông báo hoàn chỉnh của bạn .

+0

Thông báo trước với phương pháp này là BroadcastReceiver sẽ được gắn với vòng đời hoạt động. Tốt hơn nên sử dụng [bộ thu nhận đăng ký kê khai] (http://stackoverflow.com/a/13824306/80425) để tăng thông báo. –

+0

@DavidCaunt. Điểm tốt, được đề cập trong câu trả lời của bạn. Tôi đã +1 nó. –

Các vấn đề liên quan