您的位置:首页 > 移动开发 > Android开发

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

2016-06-29 11:23 776 查看
之前做项目,项目里需要自动更新,在这里记录一下。所谓自动更新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(curCou
974e
nt / 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,所以我觉得有必要记录一下。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: