Notification通知栏在app更新时自定义布局与原生态的对比分析(自定义的布局会卡死!)

在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 = “程序退出,停止下载”;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值