안드로이드 2.3 버전부터 인터넷 다운로드 작업을 지원하는 다운로드 매니저(DownloadManager)라는 프레임워크를 제공한다
만약 다운로드해야 할 데이터가 크거나 또는 당장 사용하지 않는다면, java.net 패키지나 HttpClient 컴포넌트를 사용하는 것보다 안드로이드에서 제공하는 다운로드 매니저를 사용하는 것도 생각해 볼만하다
일단 다운로드 매니저가 다운로드 작업을 실행하면, 아래 그림처럼 노티피케이션 리스트와 상태바에 나타난다. 그리고 다운로드가 완료되면 노티피케이션에서 다운로드 항목이 사라지면서 단말기 내 애플리케이션들에 다운로드가 완료되었다는 사실을 브로드캐스트로 보낸다
만약 다운로드 되자마자 사용자가 직접 다운로드된 파일을 보고자 한다면, 브로드캐스트 리시버를 만들어야 한다
일반적으로 다운로드된 데이터는 SD 카드에 저장하므로 다음과 같이 외장형 저장소에 대한 사용 권한을 얻어야 한다
다운로드 매니저 클래스는 android.app 패키지에서 다음과 같이 세 종류의 클래스로 제공된다
- DownloadManager : 다운로드 시작/취소, 다운로드 파일 열기, 다운로드한 파일을 조회할 수 있는 메서드를 제공한다
- DownloadManager.Request : 다운로드 시작에 필요한 정보를 제공한다
- DownloadManager.Query : 다운로드된 파일을 찾고 조회하는 기능을 제공한다
- 다운로드 작업 준비
- 사용자가 다운로드할 데이터를 선택한다
-
- 브로드캐스트 리시버를 등록한다
- ACTION_DOWNLOAD_COMPLETE : 다운로드가 완료되었을 때 발송
- ACTION_NOTIFICATION_CLICKED : 사용자가 노티피케이션 상태바를 클릭 시 발생
- 다운로드 매니저 객체를 생성한다
-
- 다운로드 대기열에 URI 객체를 넣는다
-
- 만약 다운로드를 취소하고 싶다면 반환받은 아이디를 매개변수로 사용하여 remove 메서드를 호출한다
- DownloadManager.Request setTitle(title) : 다운로드 데이터의 제목을 정함
- DownloadManager.Request setDescription(desc) : 다운로드 데이터의 세부 설명을 정함
- DownloadManager.Request setAllowedNetworkTypes(flags) : 다운로드 진행 시 사용 가능한 3G 망이나 와이파이 등의 네트워크 종류를 설정한다. 네트워크 종류를 명시하지 않으면 연결된 네트워크에서 다운로드가 진행된다
- DownloadManager.Request setDestinationUri(uri) : 다운로드 데이터가 저장될 경로를 지정한다
- 다운로드 프레임워크는 사용자에게 노티피케이션으로 진행 상태를 알린다
- 안드로이드 시스템에서 알아서 처리하는 작업이다
- DownlaodManager.Query() : 다운로드한 데이터를 찾는 DownlaodManager.Query 객체를 생성한다
- DownlaodManager.Query setFilterById(long..ids) : 매개 변수로 제공한 id는 enqueue() 메서드를 호출하였을 때 반환받은 아이디이다
- DownlaodManager.Query setFilterByStatus(int flags) : 특정 다운로드한 데이터의 상태를 매개 변수로 사용하여 데이터를 찾는다
- DownlaodManager query(DownlaodManager.Query query) : 다운로드한 데이터 중 조건이 일치하는 데이터를 검색하여 커서로 반환한다
- ParcelFileDescriptor openDownloadFile(long id) : 다운로드되어 저장된 파일을 오픈한다
- static final String COLUMN_STATUS (다운로드 받은 데이터 상태는 아래와 같은 상수로 나타낸다)
- static final int STATUS_SUCCESSFUL
- static final int STATUS_RUNNING
- static final int STATUS_FAILED
- static final int STATUS_PAUSED
- static final String COLUMN_REASON
- HTTP 프로토콜에서 제공하는 상태라인의 상태코드를 제공한다
- static final String COLUMN_URI
- 다운로드한 데이터를 가리키는 Uri 객체이다