Android 实现应用下载并在通知栏展示进度通知 打开APK文件

之前做项目,项目里需要自动更新,在这里记录一下。所谓自动更新APK无非就两点,

1.下载文件

2.展示下载进度

我这里是先展示一个下载进度对话框,当对话框消失时,在发送下载进度通知,很简单,上代码。


package com.lcworld.util;

import android.app.Notification;
import android.app.NotificationManager;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Handler;
import android.os.Message;
import android.support.v4.app.NotificationCompat;
import android.util.Log;
import android.widget.Toast;

import com.lcworld.hnrecovery.R;
import com.lcworld.hnrecovery.application.HNApplication;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.SocketTimeoutException;
import java.net.URL;

/**
 * 创建: dongshuaijun .
 * 日期:2016/4/22.
 * 注释:应用更新
 */
public class AppUpdateUtil implements ProgressDialog.OnDismissListener {

    private ProgressDialog progressDialog; //下载对话框进度 提示
    private NotificationManager notificationManager;
    private Notification notification; //下载通知进度提示
    private NotificationCompat.Builder builder;
    private boolean flag = false; //进度框消失标示 之后发送通知
    public static boolean isUpdate = false; //是否正在更新
    private Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            if (msg.what != 0) {
                builder.setProgress(100, msg.what, false);
                builder.setContentText("下载进度:" + msg.what + "%");
                notification = builder.build();
                notificationManager.notify(1, notification);
            }

        }
    };

    public AppUpdateUtil(ProgressDialog progressDialog) {
        this.progressDialog = progressDialog;
        initNotification();
        setListener();
    }

    private void setListener() {
        progressDialog.setOnDismissListener(this);
    }

    //初始化通知
    private void initNotification() {
        notificationManager = (NotificationManager) HNApplication.app.getSystemService(Context.NOTIFICATION_SERVICE);
        builder = new NotificationCompat.Builder(HNApplication.app);
        builder.setContentTitle("正在更新...") //设置通知标题
                .setSmallIcon(R.mipmap.icon_app) //设置通知的小图标
                .setLargeIcon(BitmapFactory
                        .decodeResource(HNApplication.app.getResources(),
                                R.mipmap.icon_app)) //设置通知的大图标
                .setDefaults(Notification.DEFAULT_LIGHTS) //设置通知的提醒方式: 呼吸灯
                .setPriority(NotificationCompat.PRIORITY_MAX) //设置通知的优先级:最大
                .setAutoCancel(false)//设置通知被点击一次是否自动取消
                .setContentText("下载进度:" + "0%")
                .setProgress(100, 0, false);
        notification = builder.build();//构建通知对象
    }

    //下载apk程序代码
    public File downLoadFile(String httpUrl) {
        isUpdate = true;
        final String fileName = System.currentTimeMillis() + "_test.apk";
        File filePath = new File("/sdcard/update");
        if (!filePath.exists()) {
            filePath.mkdirs();
        }
        final File file = new File("/sdcard/update/" + fileName);
        try {
            URL url = new URL(httpUrl);
            HttpURLConnection conn = (HttpURLConnection) url.openConnection(); //打开连接
            conn.setConnectTimeout(10000);  // 连接超时时间 毫秒级 10S
            conn.setReadTimeout(10000); //读取超时时间
            conn.setRequestMethod("GET"); //请求方式
            conn.setDoInput(true); //打开输入流
            conn.connect(); //获取连接
            int count = conn.getContentLength(); //文件总大小 字节
            int curCount = 0; // 累计下载大小 字节
            int curRead = -1;// 每次读取大小 字节
            progressDialog.setMax(count / 1024 / 1024);
            if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) { //响应成功 200
                InputStream is = conn.getInputStream();
                FileOutputStream fos = new FileOutputStream(file);
                byte[] buf = new byte[1024];
                long beforeTime = System.currentTimeMillis();
                while ((curRead = is.read(buf)) != -1) {
                    curCount += curRead; //累加每次读取的字节大小
                    if (flag) {
                        //1秒 更新2次进度 非常重要 否则 系统会慢慢卡死
                        if (System.currentTimeMillis() - beforeTime > 500) {
                            Message message = new Message();
                            message.what = (int) (((double) curCount / (double) count) * 100);
                            handler.sendMessage(message);
                            beforeTime = System.currentTimeMillis();
                        }
                    } else {
                        progressDialog.setProgress(curCount / 1024 / 1024);
                    }
                    fos.write(buf, 0, curRead); //写入文件
                }
                LogUtil.e("下载完成");
                fos.close(); //关闭文件输出流
                is.close();//关闭输入流
                conn.disconnect();//断开连接
                isUpdate = false; //设置没有更新
                if (flag) notificationManager.cancel(1); //取消通知
            }
            progressDialog.dismiss();
        } catch (IOException e) {
            if (e instanceof SocketTimeoutException) { //连接超时异常
                AppManager.getAppManager().currentActivity().runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        progressDialog.dismiss();
                        isUpdate = false;
                        Toast.makeText(HNApplication.app, "连接超时", Toast.LENGTH_SHORT).show();
                    }
                });
            }
            e.printStackTrace();
        }
        return file;
    }

    //打开APK程序代码
    public void openFile(File file, Context context) {
        Log.e("OpenFile", file.getName());
        Intent intent = new Intent();
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        intent.setAction(Intent.ACTION_VIEW);
        intent.setDataAndType(Uri.fromFile(file),
                "application/vnd.android.package-archive");
        context.startActivity(intent);
    }

    @Override
    public void onDismiss(DialogInterface dialog) {
        ToastUtil.show("下载任务正在后台运行,可查看状态栏通知了解进度");
        flag = true; //下载进度提示框 dismiss
    }
}

下一篇 准备写一下 关于类似朋友圈这样的类似的UI,因为之前做的几个项目都有类似的功能不是和QQ空间 就是和朋友圈这种很像的UI,所以我觉得有必要记录一下。


  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值