大学IT网 - 最懂大学生的IT学习网站! QQ资料交流群:367606806
当前位置:大学IT网 > Android技巧 > android离线下载的相关知识

android离线下载的相关知识(1)

关键词:android离线下载  阅读(1463) 赞(12)

[摘要]本文是对android离线下载的相关知识的讲解,对学习Android编程技术有所帮助,与大家分享。

离线下载的功能点如下:
1.下载管理(开始、取消下载)。
2.网络判断(Wi-Fi,3G)。
3.独立进程。
4.定时和手机催醒。
5.自启动。

选择离线下载的核心方法
后台独立运行,我们很容易想到服务(Service),但是有以下几种问题
(1)如果服务的进程和应用一致,那么在应用退出后,服务会重启一次
(2)如果服务的进程和应用不一致,进程间的通信就会麻烦一点
(3)如果服务的进程和应用一致,选择IntentService,可以避免重启问题
而且我们不需要多个任务同时下载,用IntentService完全可以,而且IntentService还有其他优势

1.下载管理
这里不便关注下载的细节方法,网络下载的方法很多,大概如下:

 /**
  * 下载文件
  * @param url 下载地址
  * @param dest 下载存放的本地文件
  * @param append 断点续传
  * @return
  * @throws Exception 
  */
 public long download(String url, File dest, boolean append) throws Exception{
     //初始化变量
     //准备工作
     // ... ...
  
     try {
             // ... ...
             while((readSize = is.read(buffer)) > 0){
                 //网络判断
                  
                 os.write(buffer, 0, readSize);
                 os.flush();
                  
                 //如果需要停止下载,如取消,跳出当前下载
             }
         }
     } finally {
         // ... ...
     }
         // ... ...
 }

这里要注意几点:
(1).在下载的时候,我们希望能及时检测到网络状况,比如由Wi-Fi切换到3G网络下,我们应该能及时停止下载。
(2).当用户选择取消下载的时候,我们也能停止当前下载。

2.网络判断
获取当前网络状态,主要分为Wi-Fi和Mobile(包括3G,GPRS)两种,我们写一个工具类如下:

 public class NetworkUtils {
  
     public final static int NONE = 0;//无网络
     public final static int WIFI = 1;//Wi-Fi
     public final static int MOBILE = 2;//3G,GPRS
      
     /**
      * 获取当前网络状态
      * @param context
      * @return
      */
     public static int getNetworkState(Context context){
         ConnectivityManager connManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
          
         //手机网络判断
         State state = connManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE).getState();
         if(state == State.CONNECTED||state == State.CONNECTING){
             return MOBILE;
         }
  
         //Wifi网络判断
         state = connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI).getState();
         if(state == State.CONNECTED||state == State.CONNECTING){
             return WIFI;
         }
         return NONE;
     }
 }
«上一页1234下一页»


相关评论