在app更新时:我的app包大小是21.0M;
我想在更新的时候在后台更新,使用notification通知栏;因为主流的app都是这样做的,既能很明显的看到当前下载的进度,同时也不影响app的使用;基于如此情况,所以我就使用通知栏进行app更新了,为了显示个好看的通知栏,所以就想着自己自定义一个布局进行使用;
自定义通知栏:手机会卡死,genymotion模拟器会坚持一会不死。
(所以这种方式是不能使用的,如果谁能解决这个问题,请评论一下,谢谢、)
/** 通知栏 */
private void showDownloadDialog() {
new UpdateAppTask().execute("");
}
NotificationManager manager;
Notification mNotification;
RemoteViews myNotificationView;
public class UpdateAppTask extends AsyncTask<String, Integer, String> {
@Override
protected String doInBackground(String... params) {
String resut = "";
try {
apkUrl = mUscModel.getDownloadPath()
+ mUscModel.getSoftwareName();
URL url = new URL(apkUrl);
HttpURLConnection conn = (HttpURLConnection) url
.openConnection();
conn.connect();
length = conn.getContentLength();
InputStream is = conn.getInputStream();
File file = new File(savePath);
if (!file.exists()) {
file.mkdir();
}
saveFileName = savePath + mUscModel.getCacheName();
String apkFile = saveFileName;
File ApkFile = new File(apkFile);
FileOutputStream fos = new FileOutputStream(ApkFile);
byte buf[] = new byte[1024];
do {
// 这就是下载速度
numread = is.read(buf);
count += numread;
publishProgress(count);
if (numread <= 0) {
// 下载完成通知安装
publishProgress(-1);
resut = "下载结束了";
break;
}
fos.write(buf, 0, numread);
} while (!interceptFlag);// 点击取消就停止下载.
fos.close();
is.close();
} catch (Exception e) {
e.printStackTrace();
resut = "下载结束了";
publishProgress(-1);
}
return resut;
}
@SuppressWarnings("deprecation")
@Override
protected void onPreExecute() {
mNotification = new Notification(R.drawable.ioc3, "软件更新...",
System.currentTimeMillis());
myNotificationView = new RemoteViews(mContext.getPackageName(),
R.layout.update_cfs_progress);
mNotification.contentView = myNotificationView;
manager.notify(notication_ID, mNotification);
}
@Override
protected void onPostExecute(String result) {
if ("下载结束了".equals(result)) {
installApk();
ComApplicaUtil.show("正在安装中...");
manager.cancel(notication_ID);
}
}
@Override
protected void onProgressUpdate(Integer... values) {
/** 一直在更新,这个反而对系统不会构成影响,但是manager.notify..一直刷新ui,直接卡爆 */
Log.v("UpdateApp", "===" + values[0]);
if (values[0] < 0) {
myNotificationView.setTextViewText(R.id.txt_tip,
mContext.getString(R.string.app_main_name) + "下载完成请安装");
ComApplicaUtil.show("正在安装中...");
} else {
myNotificationView.setProgressBar(R.id.cfs_progress, count,
values[0], true);
***/** 这个一直在更新。非常消耗内存,最终卡死 */
manager.notify(notication_ID, mNotification);***
}
super.onProgressUpdate(values);
}
}
同样的功能,写成了系统的notification通知栏布局的时候它就非常流畅;页面如下:此处的代码就不大篇幅粘贴了,在附件中上传了。
效果图如下:
2中方式的类已经打包了,地址:http://download.csdn.net/detail/yangjianbo456/9394825
现在说说2种布局所实用的环境位置:
1.自定义布局:
优点:
可以使用在每天推送的一条信息,那样需要自定义成自己需要的布局。
缺点(暂时因为没有解决更新时重复刷新UI导致的系统卡死,重启手机的问题,所以列为缺点)
需要重复更新ui时(比如app更新时,更新进度条),不能使用自定义布局,消耗内存多。
2.系统布局:
缺点:
界面简陋;
优点:
需要重复更新ui时(比如app更新时,更新进度条),使用系统的布局好,布局不复杂,所以不会给更新增加复杂性,导致系统内存耗尽。
(在网上也没有找到自定义布局用于app更新的案例,以及说明,所以今天花了好长时间也没有得出一个结论,不知道是否是这样的原因,希望大家有兴趣的话可以互相交流,共同进步。)
在其他类引用方式:
UpdateSoftware updateSW = new UpdateSoftware(this, Luscs.get(0));
updateSW.checkUpdateInfo();
2个类需要下载,链接为(无积分):http://download.csdn.net/detail/yangjianbo456/9394825
原生态通知栏内容参考:http://www.mamicode.com/info-detail-468717.html
补充:上面说的不全面,也是有问题的:
还是有很大的bug的:在模拟器上是可以运行,第二天我用手机运行时还是卡死,说明原生的通知栏在加载几万次之后还是会卡死的。20M的app,每次下载1kb,也就是下载了20*1024*1kb,即下载了2万次,通知栏界面刷新了2万次;最终卡死。最终我还是选择了只通知通知栏更新刷新界面100次,这样就不卡了。在下载的时候设置。代码如下,如果有疑问,或者有更好方法的,不妨互相沟通一下。
byte buf[] = new byte[1024];
/*一定得限制其次数,不然重复加载ui手机是会卡死的,100次是可以的/
int x = 0;
do {
// 这就是下载速度
numread = is.read(buf);
count += numread;
// 让它只加载100次
int i = count * 100 / length;
if (i > x) {
publishProgress(count);
}
if (numread <= 0) {
// 下载完成通知安装
publishProgress(-1);
resut = “下载结束了”;
break;
}
x = i;
fos.write(buf, 0, numread);
} while (!interceptFlag);// 点击取消就停止下载.
//如果暂停,或者删除通知了,则触发这个事件(未下载完,程序正常退出了)
if(interceptFlag){
publishProgress(-1);
resut = “程序退出,停止下载”;
}