須要在 manifest 文件中配置
<user-permission android:name="android.permission.INTERNET" />
java
在最新版本的 Android 上在 UI 線程上執行網絡操做會引起 NetworkOnMainThreadException 異常,必定要再後臺線程中執行。android
try { URL url = new URL("http://www.baiud.com"); // 建立 HTTP URL 鏈接 URLConnection connection = url.openConnection(); HttpURLConnection httpConnection = (HttpURLConnection) connection; int responseCode = httpConnection.getResponseCode(); if (responseCode == HttpURLConnection.HTTP_OK) { InputStream in = httpConnection.getInputStream(); processStream(in); } } catch (Exception e) { Log.d("TAG", "IO Exception."); }
在 android 2.3(API Level 9)中引入了 Download Manager,做爲一個 Service 來優化長時間下載操做的處理。Download Manager 經過處理 HTTP 鏈接、監控鏈接的變化和系統從新啓動來確保每一次下載都能成功完成。api
Download Manager 能夠在多個回話之間在後臺繼續進行下載。能夠經過 getSystemService 方法請求 DOWNLOAD_SERVICE 得到一個 Download Manager 對象。緩存
String serviceString = Context.DOWNLOAD_SERVICE; DownloadManager downloadManager; downloadManager = (DownloadManager) getSystemService(serviceString); Uri uri = Uri.parse("http://api.amap.com/Public/down/AMap_Android_2DMap_Lib_V2.2.0.zip"); DownloadManager.Request request = new Request(uri); // 設置 Notification request.setTitle("襄陽公交"); // 設置標題 request.setDescription("襄陽公交是一個很方便的產品。"); // 設置描述 // 設置 Notification 的顯示模式 request.setNotificationVisibility(Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED); // 設置限制下載的網絡類型(移動網絡或WIFI) // request.setAllowedNetworkTypes(Request.NETWORK_WIFI); // 設置手機漫遊時限制下載 // request.setAllowedOverRoaming(false); // 設置根據系統限制的下載文件大小,是否要肯定下載 // DownloadManager.getRecommendedMaxBytesOverMobile(this); // 使下載的文件能夠被掃描器掃描到 request.allowScanningByMediaScanner(); // 使 系統的下載管理器中能夠查看到 request.setVisibleInDownloadsUi(true);
默認狀況下下載的文件是不會被掃描到的網絡
Request 的 setNotificationVisibility
方法支持一下幾種顯示方式:ide
默認狀況下,DownloadManager 會把下載的文件保存在共享下載緩存中,並且使用系統生成的文件名。每一個下載文件均可以指定一個下載位置,可是全部的下載都必須存儲到外部存儲器中。並且須要設置外部存儲器的寫入權限:<uses-permission android:name="android.permission.WRITE_EXTRANL_STORAGE" />
優化
指定下載路徑:this
// 在外部存儲器上指定文件路徑 request.setDestinationUri(Uri.fromFile(f)); // 在應用程序的外部存儲文件夾中存儲一個文件 request.setDestinationInExternalFilesDir(this, Environment.DIRECTORY_DOWNLOADS, "tm.apk"); // 外部存儲器的公共目錄下指定一個文件夾來存儲文件 request.setDestinationInExternalPublicDir(Environment.DIRECTORY_MUSIC, "android.mp3");
能夠經過 DownloadManager 的 remove
方法取消一個正在等待的下載。已經下載的關聯文件也會被刪除。downloadManager.remove(myReference);
url
能夠經過 query
方法查詢 DownloadManager 來獲得下載請求的狀態、進度和詳細信息,該方法會返回下載的 Cursor 對象。線程
BroadcastReceiver receiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { long reference = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1); if (myReference == reference) { Query query = new Query(); query.setFilterById(myReference); Cursor cursor = downloadManager.query(query); if (cursor.moveToFirst()) { int fileNameIdx = cursor.getColumnIndex(DownloadManager.COLUMN_LOCAL_FILENAME); int fileUriIdx = cursor.getColumnIndex(DownloadManager.COLUMN_LOCAL_URI); String fileName = cursor.getString(fileNameIdx); String fileUri = cursor.getString(fileUriIdx); } cursor.close(); } } };