利用service下载图片&发送进度notification

原创 2015年11月21日 16:16:51
  • 不能在service中直接下载,需要开启子线程
  • 在子线程中下载的信息需要传递出来,包括进度,下载完毕什么的,需要一个handler去传递

代码示意:

import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;

import android.app.Activity;
import android.app.NotificationManager;
import android.app.Service;
import android.content.Intent;
import android.graphics.BitmapFactory;
import android.os.Environment;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.support.v4.app.NotificationCompat;
import android.util.Log;
import android.widget.Toast;

public class ImgService extends Service {
    private NotificationCompat.Builder builder;
    private NotificationManager manager;

    private Handler handler = new Handler() {

        public void handleMessage(android.os.Message msg) {
            switch (msg.what) {
            case -2:
                Toast.makeText(getApplicationContext(), "-----网络状态异常", 0).show();
                break;
            case -1:
                Toast.makeText(getApplicationContext(), "-----sd卡异常", 0).show();
                break;
            case 0:

                Toast.makeText(getApplicationContext(), "-----下载成功", 0).show();
                stopSelf(); // 关闭
                break;

            case 1:
                builder.setProgress(100, msg.arg1, false).setContentText(msg.arg1 + "%");
                manager.notify(10090, builder.build());
                break;
            default:
                break;
            }
        };
    };

    public void onCreate() {
        super.onCreate();
        manager = (NotificationManager) getSystemService(Activity.NOTIFICATION_SERVICE);
        builder = new NotificationCompat.Builder(getApplicationContext());

        builder.setSmallIcon(R.drawable.ic_launcher).setTicker("下载").setContentTitle("数据下载中").setLargeIcon(BitmapFactory.decodeResource(getResources(),R.drawable.ic_launcher)).setWhen(System.currentTimeMillis());
    };

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {

        final String path = intent.getStringExtra("path");
        Log.i("---------", "准备");

        // 开启线程下载
        new Thread() {
            public void run() {
                down(path);
            };
        }.start();

        return super.onStartCommand(intent, flags, startId);
    }

    public void down(String path) {
        URL url = null;
        HttpURLConnection conn = null;
        InputStream is = null;
        FileOutputStream fos = null;
        try {
            url = new URL(path);
            conn = (HttpURLConnection) url.openConnection();

            if (conn.getResponseCode() == 200) {
                is = conn.getInputStream();

                if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
                    fos = new FileOutputStream(Environment.getExternalStorageDirectory().getAbsoluteFile() + "/my.jpg");

                    byte[] b = new byte[1024];
                    int len = 0;

                    // 总的长度
                    int totalsize = conn.getContentLength();
                    // 已经下载的长度
                    int temp = 0;

                    while ((len = is.read(b)) != -1) {
                        fos.write(b, 0, len);
                        temp += len;
                        Message msg = handler.obtainMessage();
                        msg.arg1 = (temp * 100) / totalsize;
                        msg.what = 1;
                        handler.sendMessage(msg);
                    }

                    handler.sendEmptyMessage(0);
                } else {
                    // sd卡不存在
                    handler.sendEmptyMessage(-1);
                }

            } else {
                handler.sendEmptyMessage(-2);
            }

            is.close();
            fos.close();
            conn.disconnect();

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

日常开发——Service, Notification显示下载进度

最近做的一个小demo,启动Service并在Service里面创建一个线程来监听下载进度,更新notification的UI。当然,demo里面的下载并非是真正的下载文件,而是一个循环累加的数值,有...

Android实现Service后台下载Notification进度条

原文网址:http://www.obatu.com/android-service-download-notification-progressbar/  最近的项目中,有一个需求是 【后台下载+多线...
  • cynhafa
  • cynhafa
  • 2011年07月17日 23:40
  • 17079

Android版本更新(Service下载 Notification进度条:直接拿来用)

废话不多说:直接上代码: public class UpdateService extends Service { public static final String TAG = "...

Android 实现service后台多任务下载notification进度条更新

只需要一串 URL 地址,就可以实现 后台多任务下载的demo,notification进度条更新信息封装好直接提取,更新频率等问题都已优化。 由于是很久之前...
  • gjr9596
  • gjr9596
  • 2014年07月14日 16:52
  • 3268

Android实现Service下载文件,Notification显示下载进度

先放个gif。。最终效果如果: 主要演示了android从服务器下载文件,调用Notification显示下载进度,并且在下载完毕以后点击通知会跳转到安装APK的界面,演示是在真实的网络环境中使用真...

android实现下载图片在(Notification)通知栏上显示进度。

activity_main.xml

Service下载图片用通知显示进度

  • 2014年09月07日 21:37
  • 1.39MB
  • 下载

Notification使用详解之四:由后台服务向Activity发送进度信息

上次讲到了如何在Activity中监听后台服务的进度信息,实现的方式是让Activity与后台服务绑定,通过中间对象Binder的实例操作后台服务。从效果上来讲,这种方式是可行的,不过这种实现有个缺点...
  • liuhe688
  • liuhe688
  • 2011年07月28日 19:36
  • 21824

Notification使用详解之四:由后台服务向Activity发送进度信息

上次讲到了如何在Activity中监听后台服务的进度信息,实现的方式是让Activity与后台服务绑定,通过中间对象Binder的实例操作后台服务。从效果上来讲,这种方式是可行的,不过这种实现有个缺点...
  • wy819
  • wy819
  • 2016年05月19日 16:44
  • 124
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:利用service下载图片&发送进度notification
举报原因:
原因补充:

(最多只允许输入30个字)