Project를 진행하다 Download Module을 만들게 됐다. 이전에 사용해보려다 말았던 DownloadManager를 사용하기 위해, Project에서 필요한 기능들을 제공하는지 알아봤다.

Download Module에서 필요한 최소한의 기능은 아래와 같다.

 

1. DownloadFailed시에 Callback/Notify 받을 수 있어야 한다.

Download Complete는 BroadcastReceiver를 통해 Callback을 받을 수 있지만 Failed에 대한 Callback을 받을 수 있는 방법은 없는 것 같다. 다만 Download 정보를 Query하면 Download Status를 얻을 수 있어서 Failed 됐다는 사실은 알 수 있다.

즉, 주기적으로 Download 정보를 확인하는 방법을 통해 Download Status를 추적할 수 있다.

 

2. 파일의 저장경로를 지정할 수 있어야 한다.

이건 사실 당연한거라;;; Request Class의 아래 함수들을 이용해서 저장 경로를 설정할 수 있다.

setDestinationInExternalFilesDir() : Application의 하위 경로에 파일을 저장할 때 사용.

setDestinationInExternalPublicDir() : Public 경로에 파일을 저장할 때 사용.

setDestinationUri() : Uri 타입으로 경로를 설정할 때 사용.

 

3. Download progress를 0.5초 단위로 갱신할 수 있어야 한다.

다운로드 정보를 Query 하면 COLUMN_BYTES_DOWNLOADED_SO_FAR 값을 얻을 수 있는데 현재까지 Download한 용량을 byte 단위로 제공한다.

 

4. Download 작업을 취소할 수 있어야 한다.

DownloadManager의 remove(id) 함수를 통해 취소할 수 있다.

(* id는 enqueue의 return 값이다.)

 

5. 이어받기,  Pause/Resume이 가능해야 한다.

나의 경우는 이어받기 때문에 DownloadManager 사용을 망설이게 됐다.

DownloadManager의 설명을 읽어보면, 아래와 같은 부분이 나온다.

The download manager will conduct the download in the background, taking care of HTTP interactions and retrying downloads after failures or across connectivity changes and system reboots.

Download가 완료되지 못한 작업들을 DownloadManager가 기억하고 있다가 이후에 자동으로 재시도하는 구조로 되어 있는데 재시도하는 시점이나 방법에 대해서는 3rd party가 제어할 수 있는 부분이 별로 없다. Network에 연결되면 자동으로 다시 시작한다.

 

6. Notification을 제어할 수 있어야 한다.

DownloadManager에서 기본으로 제공하는 Notification을 사용하면, Notification의 Title / Description은 제어할 수 있고, Notification의 등록/제거를 알아서 해주기 때문에 편하다. 하지만 Notification이 클릭됐을때의 PendingIntent라던가 Notification의 Icon등을 제어할 수 없는 부분은 아쉽다.

(* 기본으로 제공하는 Notification은 setNotificationVisibility() 함수를 통해 사용할 수 있다.)

Notification의 PendingIntent나 Icon까지 제어하려면 DownloadManager가 기본으로 제공하는 Notification을 비활성화 한 뒤, 직접 Notification을 생성/등록/제거 하면 된다.