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

發佈了82 篇原創文章 · 獲贊 22 · 訪問量 20萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章