IntentService实现下载



IntentService is a base class for Services
that handle asynchronous requests (expressed as Intents)
on demand. Clients send requests through startService(Intent) calls;
the service is started as needed, handles each Intent in turn using a worker thread, and stops itself when it runs out of work.

This "work queue processor" pattern is commonly used to offload tasks from an application‘s main thread. The IntentService class exists to simplify this pattern and take care of the mechanics. To use it, extend IntentService and implement onHandleIntent(Intent).
IntentService will receive the Intents, launch a worker thread, and stop the service as appropriate.

All requests are handled on a single worker thread -- they may take as long as necessary (and will not block the application‘s main loop), but only one request will be processed at a time.

总结:与普通的Service不同有几点:

1、相当于一个线程,在onHandleIntent里面可以执行下载等长时间的任务,而Service里面会导致ANR

2、每次IntentService只会执行一个任务,也就是第二次调用IntentService会等待第一个任务执行完才会进行。所以对于一次只能下载一个文件这种场景来说还是比较好用的。

没有解决的问题:

1、IntentServcie怎么暂停当前任务,执行下一个任务?比如暂停一个下载。

下面是写的代码是使用的例子:(当然是在非常理想情况下:网络中断就挂喽)

public class DownloadService extends IntentService {

public static final int UPDATE_PROGRESS = 8344;

private static final String TAG = "DownloadService";

private String fileName = null;//文件名

private int fileLength = 0;//文件长度

private ContentResolver resolver;

private Uri uri;

private int sendTime = 0;

public DownloadService() {

super("DownloadService");

}

@Override

protected void onHandleIntent(Intent intent) {

String downloadUrl = intent.getStringExtra("downloadUrl");

if (!FileUtil.checkFileDir()) {

return;

}

//初始化contentprovider

resolver = this.getContentResolver();

uri = Uri.parse(ConstantUtil.content_provider_uri);

fileName = FileUtil.getFileNameByUrl(downloadUrl);

try {

fileName = URLDecoder.decode(fileName, "UTF-8");

} catch (UnsupportedEncodingException e) {

Log.e(TAG, e.getMessage());

}

//TODO 需要判断是否正在下载或已经下载,名称要反编码为中文

try {

URL url = new URL(downloadUrl);

URLConnection connection = url.openConnection();

connection.connect();

fileLength = connection.getContentLength();

int pieceSize = fileLength / 20;

// 初始化进度

//            initProgress();

// 下载文件 TODO 网络异常时,要进行处理

InputStream input = new BufferedInputStream(url.openStream());

OutputStream output = new FileOutputStream(ConstantUtil.downloadFileDir + fileName);

byte data[] = new byte[1024];

long total = 0;

int count;

while ((count = input.read(data)) != -1) {

total += count;

output.write(data, 0, count);

//总共发10次更新消息

if (total >= pieceSize * sendTime) {

Log.i(TAG, "=========sendTime==========" + sendTime + fileName);

updateProgress(total);

sendTime++;

}

}

output.flush();

output.close();

input.close();

} catch (IOException e) {

e.printStackTrace();

}

//完成下载

sendTime = 0;

finishProgress();

}

/**

* 向数据库中插入初始化数据

*/

private void initProgress() {

ContentValues values = new ContentValues();

values.put(DataBaseUtil.DOWNLOAD_FILE_NAME, fileName);

values.put(DataBaseUtil.CREATE_FILE_DATE, new Date().toString());

values.put(DataBaseUtil.DOWNLOAD_FILE_TOTAL_SIZE, fileLength);

values.put(DataBaseUtil.DOWNLOAD_FILE_CURRENT_SIZE, 0);

values.put(DataBaseUtil.DOWNLOAD_FINISHED, false);

resolver.insert(uri, values); //向ContentProvider插入数据

}

/**

*

* 更新进度

*

*<p>detail comment

*@see

*@since

*

*/

private void updateProgress(long currentSize) {

ContentValues values = new ContentValues();

values.put(DataBaseUtil.DOWNLOAD_FILE_CURRENT_SIZE, currentSize);

values.put(DataBaseUtil.DOWNLOAD_FILE_TOTAL_SIZE, fileLength);

values.put(DataBaseUtil.DOWNLOAD_FINISHED, false);

values.put(DataBaseUtil.CREATE_FILE_DATE, new Date().toString());

resolver.update(uri, values, "name=?", new String[] { fileName });

}

/**

*

* 完成下载

*

*<p>detail comment

*@param currentSize

*@see

*@since

*

*/

private void finishProgress() {

ContentValues values = new ContentValues();

values.put(DataBaseUtil.DOWNLOAD_FILE_CURRENT_SIZE, fileLength);

values.put(DataBaseUtil.DOWNLOAD_FINISHED, true);

resolver.update(uri, values, "name=?", new String[] { fileName });

}

}



IntentService实现下载

时间: 2024-12-28 20:38:25

IntentService实现下载的相关文章

android命令模式IntentService 远程下载文件

服务可用在一下情景: 1,用户离开activity后,仍需要继续工作,例如从网络下载文件,播放音乐. 2,无论activity出现或离开,都需要持续工作,例如网络聊天应用. 3,连接网络服务,正在使用一个远程API提供的服务. 4,定时触发的任务 1.因为IntentService是Service子类,所以也需要在manifest中声明服务 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns

Android中Service与IntentService的使用比较

不知道大家有没有和我一样,以前做项目或者 练习的时候一直都是用Service来处理后台耗时操作,却很少注意到还有个IntentService,前段时间准备面试的时候看到了一篇关于 IntentService的解释,发现了它相对于Service来说有很多更加方便之处,今天在这里稍微来总结下我的心得. 首先IntentService是继承自Service的,那我们先看看Service的官方介绍,这里列出两点比较重要的地方: 1.A Service is not a separate process.

Android中如何下载文件并显示下载进度

原文地址:http://jcodecraeer.com/a/anzhuokaifa/androidkaifa/2014/1125/2057.html 这里主要讨论三种方式:AsyncTask.Service和使用DownloadManager. 一.使用AsyncTask并在进度对话框中显示下载进度 这种方式的优势是你可以在后台执行下载任务的同时,也可以更新UI(这里我们用progress bar来更新下载进度) 下面的代码是使用的例子 1 // declare the dialog as a

Android四大组件——Service后台服务、前台服务、IntentService、跨进程服务、无障碍服务、系统服务

Service后台服务.前台服务.IntentService.跨进程服务.无障碍服务.系统服务 本篇文章包括以下内容: 前言 Service的简介 后台服务 不可交互的后台服务 可交互的后台服务 混合性交互的后台服务 前台服务 IntentService AIDL跨进程服务 AccessibilityService无障碍服务 系统服务 部分源码下载 前言 作为四大组件之一的Service类,是面试和笔试的必备关卡,我把我所学到的东西总结了一遍,相信你看了之后你会对Service娓娓道来,在以后遇

使用IntentService给自己的Android应用写一个文件下载器。

接着上一篇的http://www.cnblogs.com/zhengxt/p/3657833.html,当我们想给自己的APP写一个文件下载器时,可以用重写IntentService来实现. 使用IntentService有几个好处,IntentService继承于Service,适合拿来处理一些耗时又不需要去管它的任务.把要执行的任务用Intent加入到队列中,IntentService会有一个工作线程来取出队列中的Intent来处理.需要实现抽象方法onHandleIntent方法来执行这些

Android学习笔记(五一):服务Service(上)- IntentService

对于需要长期运行,例如播放音乐.长期和服务器的连接,即使已不是屏幕当前的activity仍需要运行的情况,采用服务方式.服务将通过API触发启动或者通过IPC(Interprocess Communication)连接请求触发启动.服务将一直运行直至被关闭,或者内存不足时由系统关闭.一般而言,为了节省电量,服务应进行优化减少CPU的消耗和大量网络通信.服务可用于以下的场景: 1.用户离开activity后,仍需继续工作,例如从网络下载文件,播放音乐2.无论activity出现(重现)或离开,都需

IntentSerive下载文件(2)

service下载文件,加入标签: <service android:name=".MyService"></service> 添加相关权限: <uses-permission android:name="android.permission.INTERNET"/><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE&quo

android离线下载的相关知识

离线下载的功能点如下:      1.下载管理(开始.取消下载).      2.网络判断(Wi-Fi,3G).      3.独立进程.      4.定时和手机催醒.      5.自启动. 选择离线下载的核心方法 后台独立运行,我们很容易想到服务(Service),但是有以下几种问题 (1)如果服务的进程和应用一致,那么在应用退出后,服务会重启一次 (2)如果服务的进程和应用不一致,进程间的通信就会麻烦一点 (3)如果服务的进程和应用一致,选择IntentService,可以避免重启问题

android 四大组件之Service(4)IntentService

IntentService : 自带线程,处理请求,但每次值处理一个线程.主要实现一个方法 onHandleIntent(); Service类的子类,它使用了工作(worker)线程来处理所有的启动请求,每次请求都会启动一个线程 如果服务不需要同时处理多个请求的话,这是最佳的选择. 所有你要做的工作就是实现onHandleIntent()即可,它会接收每个启动请求的intent,然后就可在后台完成工作. 因为大多数started服务都不需要同时处理多个请求(这实际上是一个危险的多线程情况),所