我看网上很多下载文件都是通过service来实现的改变通知栏消息,其实用线程实现更方便,代码低耦合,因此我修改了网上的一个例子。代码如下:
main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >
<Button
android:id="@+id/bb"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="点我下载"
/>
</RelativeLayout>
MainActivity
package com.example.downloadandnotificationbar;
import android.app.Activity;
import android.os.Bundle;
import android.os.Environment;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class MainActivity extends Activity {
private Button button;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button = (Button) findViewById(R.id.bb);
final String filePath = Environment.getExternalStorageDirectory() + "/ss";
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
new UpdateApkThread("http://down.qqtn.com/qq3/mobileqq_android_qqtn.apk", filePath, "QQ.apk",MainActivity.this).start();
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
UpdateApkThread
package com.example.downloadandnotificationbar;
import java.io.File;
import java.text.DecimalFormat;
import java.util.Timer;
import java.util.TimerTask;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Handler;
import android.os.Message;
import android.widget.RemoteViews;
public class UpdateApkThread extends Thread {
private String downloadUrl;
private File saveFile;
private String fileName;
private Context context;
private NotificationManager notificationManager;// 状态栏通知管理类
private Notification notification;// 状态栏通知
private RemoteViews notificationViews;// 状态栏通知显示的view
private Timer timer;// 定时器,用于更新下载进度
private TimerTask task;// 定时器执行的任务
private final int notificationID = 1;// 通知的id
private final int updateProgress = 1;// 更新状态栏的下载进度
private final int downloadSuccess = 2;// 下载成功
private final int downloadError = 3;// 下载失败
private DownLoadUtil downLoadUtil;
public UpdateApkThread(String downloadUrl, String fileLocation, String fileName, Context context) {
this.downloadUrl = downloadUrl;
this.saveFile = new File(fileLocation);
this.context = context;
this.fileName = fileName;
}
@Override
public void run() {
super.run();
try {
initNofication();
handlerTask();
downLoadUtil = new DownLoadUtil();
int downSize = downLoadUtil.downloadUpdateFile(downloadUrl, saveFile, fileName, callback);
if (downSize == downLoadUtil.getRealSize() && downSize != 0) {
handler.sendEmptyMessage(downloadSuccess);
}
} catch (Exception e) {
e.printStackTrace();
}
}
private void initNofication() {
notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
notification = new Notification();
notification.icon = R.drawable.ic_launcher;// 设置通知消息的图标
notification.tickerText = "正在下载。。。";// 设置通知消息的标题
notificationViews = new RemoteViews(context.getPackageName(), R.layout.down_notification);
notificationViews.setImageViewResource(R.id.download_icon, R.drawable.ic_launcher);
}
private void handlerTask() {
timer = new Timer();
task = new TimerTask() {
@Override
public void run() {
handler.sendEmptyMessage(updateProgress);
}
};
timer.schedule(task, 500, 500);
}
Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
if (msg.what == updateProgress) {// 更新下载进度
int fileSize = downLoadUtil.getRealSize();
int totalReadSize = downLoadUtil.getTotalSize();
if (totalReadSize > 0) {
float size = (float) totalReadSize * 100 / (float) fileSize;
DecimalFormat format = new DecimalFormat("0.00");
String progress = format.format(size);
notificationViews.setTextViewText(R.id.progressTv, "已下载" + progress + "%");
notificationViews.setProgressBar(R.id.progressBar, 100, (int) size, false);
notification.contentView = notificationViews;
notificationManager.notify(notificationID, notification);
}
} else if (msg.what == downloadSuccess) {// 下载完成
notificationViews.setTextViewText(R.id.progressTv, "下载完成");
notificationViews.setProgressBar(R.id.progressBar, 100, 100, false);
notification.contentView = notificationViews;
notification.tickerText = "下载完成";
notificationManager.notify(notificationID, notification);
if (timer != null && task != null) {
timer.cancel();
task.cancel();
timer = null;
task = null;
}
// 安装apk
Uri uri = Uri.fromFile(new File(saveFile + "/BuyCake.apk"));
Intent installIntent = new Intent(Intent.ACTION_VIEW);
installIntent.setDataAndType(uri, "application/vnd.android.package-archive");
// PendingIntent 通知栏跳转
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, installIntent, 0);
notification.flags |= Notification.FLAG_AUTO_CANCEL;
notification.contentIntent = pendingIntent;
notification.contentView.setTextViewText(R.id.progressTv, "下载完成,点击安装");
notificationManager.notify(notificationID, notification);
} else if (msg.what == downloadError) {// 下载失败
if (timer != null && task != null) {
timer.cancel();
task.cancel();
timer = null;
task = null;
}
notificationManager.cancel(notificationID);
}
}
};
DownloadFileCallback callback = new DownloadFileCallback() {
@Override
public void downloadError(String msg) {
handler.sendEmptyMessage(downloadError);
}
};
}
DownLoadUtil
public int downloadUpdateFile(String downloadUrl, File saveFile,String fileName, DownloadFileCallback callback)
throws Exception {
HttpURLConnection httpConnection = null;
InputStream is = null;
FileOutputStream fos = null;
try {
URL url = new URL(downloadUrl);
httpConnection = (HttpURLConnection) url.openConnection();
httpConnection.setConnectTimeout(10000);
httpConnection.setReadTimeout(20000);
if (httpConnection.getResponseCode() == 404) {
httpConnection.disconnect();
callback.downloadError("下载地址不存在或暂时无法访问");
return 0;
}
realSize = httpConnection.getContentLength();
is = httpConnection.getInputStream();
File file = new File(saveFile,fileName);
if(!file.getParentFile().exists()){
file.getParentFile().mkdirs();
}
fos = new FileOutputStream(file, false);
byte buffer[] = new byte[4096];
int readSize = 0;
while ((readSize = is.read(buffer)) > 0) {
fos.write(buffer, 0, readSize);
totalSize += readSize;
}
} catch (Exception e) {
Log.e(TAG, "下载失败");
callback.downloadError("下载失败");
} finally {
if (httpConnection != null) {
httpConnection.disconnect();
}
if (is != null) {
is.close();
}
if (fos != null) {
fos.close();
}
}
return totalSize;
}
具体源码地址为: http://download.csdn.net/detail/mnb123jhg/6516253