天天看點

Android大資料、斷點續傳、耗時下載下傳之DownloadManager開發簡介(1)



Android大資料、斷點續傳、耗時下載下傳之DownloadManager開發簡介(1)

Android涉及到的網絡資料請求,如果是零星資料、且資料量較小(幾十KB到幾百KB,1MB以内),一般的,可以自己使用Android原生HTTP或者第三方開源架構如Volley(相關文章:

http://blog.csdn.net/zhangphil/article/details/48049831 ),AsyncHttpClient(相關文章: http://blog.csdn.net/zhangphil/article/details/48595817 ),Glide(相關文章, http://blog.csdn.net/zhangphil/article/details/45535693

)等等異步資料請求輕松完成任務。

然而,如果下載下傳資料大,幾MB到幾百MB甚至GB量級的資料,這種情況下載下傳任務必然耗時,并且極可能需要斷點續傳,典型的,如現在很多手機應用市場APP,給使用者提供多任務下載下傳APP安裝檔案到本地的功能,而這些APP小則幾MB大則上百MB,那麼這種場景就應該考慮使用Android DownloadManager。

Android DownloadManager就是為了支援大資料、斷點續傳這些下載下傳任務而設計的。

現在給出一個簡單的例子,說明如何使用Android DownloadManager從一個給定的URL下載下傳一個較大資料(若幹MB)。

測試的MainActivity.java:

package zhangphil.demo;

import android.app.Activity;
import android.app.DownloadManager;
import android.app.DownloadManager.Request;
import android.content.Context;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.view.View;
import android.widget.Button;

public class MainActivity extends Activity {

	private DownloadManager downloadManager;
	private long Id;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		Button button = (Button) findViewById(R.id.button);
		button.setOnClickListener(new View.OnClickListener() {

			@Override
			public void onClick(View v) {
				// remove将依據Id号取消相應的下載下傳任務
				// 可批量取消,remove(id1,id2,id3,id4,...);
				downloadManager.remove(Id);
			}
		});

		downloadManager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);

		// 假設從這一個連結下載下傳一個大檔案。
		Request request = new Request(
				Uri.parse("http://apkc.mumayi.com/2015/03/06/92/927937/xingxiangyi_V3.1.3_mumayi_00169.apk"));

		// 僅允許在WIFI連接配接情況下下載下傳
		request.setAllowedNetworkTypes(Request.NETWORK_WIFI);

		// 通知欄中将出現的内容
		request.setTitle("我的下載下傳");
		request.setDescription("下載下傳一個大檔案");
		// 下載下傳過程和下載下傳完成後通知欄有通知消息。
		request.setNotificationVisibility(Request.VISIBILITY_VISIBLE | Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);

		// 此處可以由開發者自己指定一個檔案存放下載下傳檔案。
		// 如果不指定則Android将使用系統預設的
		// request.setDestinationUri(Uri.fromFile(new File("")));

		// 預設的Android系統下載下傳存儲目錄
		request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, "my.apk");

		// enqueue 開始啟動下載下傳...
		Id = downloadManager.enqueue(request);
	}
}
           

MainActivity.java需要的activity_main.xml裡面僅僅隻有一個Button按鈕用于測試取消下載下傳任務,在次不再贅述。

不要忘記在AndroidManifest.xml中添加相關權限。讀寫儲存設備權限,網絡通路請求權限,以及下載下傳權限:

<uses-permission android:name="android.permission.ACCESS_DOWNLOAD_MANAGER"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 
    <uses-permission android:name="android.permission.INTERNET"/>           

繼續閱讀