新增功能:進度條顯示更新進度

1.把下載和查詢下載進度的方法分開

//服務(wù)器中APK下載地址
    private String updateurl;
    private Context context;
// 下載應(yīng)用的進度條
    private ProgressDialog mProgressDialog;
//下載唯一ID
    private long refernece;
    private DownloadManager downloadManager;
    /**
     * 從服務(wù)器中下載APK
     */
    private void downLoadApk() {
        if (TextUtils.isEmpty(updateurl)) {
            return;
        }
        try {
            String serviceString = Context.DOWNLOAD_SERVICE;
            context = this.getApplicationContext();
            downloadManager = (DownloadManager) context.getSystemService(serviceString);
            //將下載地址url放入uri中
            Uri uri = Uri.parse(updateurl);
            DownloadManager.Request request = new DownloadManager.Request(uri);
            request.allowScanningByMediaScanner();
            request.setVisibleInDownloadsUi(true);
            request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
            request.setMimeType("application/vnd.android.package-archive");
            //文件如果存在骗爆,則刪除原來文件
            File file = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/app-debug/", "app-debug.apk");
            if (file.exists()) {
                file.delete();
            }         request.setDestinationInExternalPublicDir(Environment.getExternalStorageDirectory().getAbsolutePath() + "/app-debug/", "app-debug.apk");
            //獲得唯一下載id
            refernece = downloadManager.enqueue(request);
            //將id放進Intent
            Intent localIntent = new Intent(BROADCAST_ACTION);
            localIntent.putExtra(EXTENDED_DATA_STATUS, refernece);
        } catch (Exception exception) {
            Toast.makeText(getApplicationContext(), "下載新版本失敗", Toast.LENGTH_SHORT).show();
            loginMain();
        }
    }
/**
     * 查詢下載狀態(tài)
     */
private void searchStatus(){
        String serviceString = Context.DOWNLOAD_SERVICE;
        context = this.getApplicationContext();
        downloadManager = (DownloadManager) context.getSystemService(serviceString);
            //查詢下載信息
            DownloadManager.Query query=new DownloadManager.Query();
            query.setFilterById(refernece);
            try{
                boolean isGoging=true;
                while(isGoging){
                    Cursor cursor = downloadManager.query(query);
                    if (cursor != null && cursor.moveToFirst()) {
                        //獲取當前下載量
                        long downloadedBytes = cursor.getLong(
                                cursor.getColumnIndexOrThrow(DownloadManager.COLUMN_BYTES_DOWNLOADED_SO_FAR));
                        long totalBytes = cursor.getLong(
                                cursor.getColumnIndexOrThrow(DownloadManager.COLUMN_TOTAL_SIZE_BYTES));
                        mProgressDialog.setMax(((int) (totalBytes / 1024)));
                        int status = cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_STATUS));
                        switch(status){
                            case DownloadManager.STATUS_RUNNING:
                                mProgressDialog.setProgress(((int) (downloadedBytes / 1024)));
                                if(!mProgressDialog.isShowing()){
                                    mProgressDialog.show();
                                }
                                break;
                            //如果下載狀態(tài)為成功
                            case DownloadManager.STATUS_SUCCESSFUL:
                                isGoging=false;
                                mProgressDialog.dismiss();
                                installApkDialog();
                             case DownloadManager.STATUS_FAILED:
                                isGoging = false;
                                Toast.makeText(getApplicationContext(), "下載新版本失敗",  Toast.LENGTH_SHORT).show();
                                loginMain();
                                break;
                            case DownloadManager.STATUS_PAUSED:
                                searchReason();
                                break;
                        }
                    }

                    if(cursor!=null){
                        cursor.close();
                    }
                }
            }catch(Exception e){
                e.printStackTrace();
            }
    }

2.顯示進度條

/**
     * 下載進度顯示
     */
    private void getProgressDialog() {
        mProgressDialog = new ProgressDialog(this);
        mProgressDialog.setProgressNumberFormat("%1d KB/%2d KB");
        mProgressDialog.setMessage("正在更新...");
        mProgressDialog.setIndeterminate(false);
        mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);//水平進度條
        mProgressDialog.setCancelable(true);//設(shè)置是否可以通過點擊Back鍵取消
        mProgressDialog.show();
        new Thread(){
            public void run(){
                try {
                    Looper.prepare();
                    downLoadApk();
                    searchStatus();
                    Looper.loop();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }

        }.start();

    }

Android中的Looper類,是用來封裝消息循環(huán)和消息隊列的一個類踏揣,用于在android線程中進行消息處理靶溜。handler其實可以看做是一個工具類,用來向消息隊列中插入消息的夜焦。
先調(diào)用Looper.prepare()啟用Looper壳澳;Looper.loop(); loop函數(shù)從MessageQueue中從前往后取出Message,Looper.loop()中是個while循環(huán)茫经,只有對它所在線程的Looper調(diào)用了quit()函數(shù)巷波,Looper.loop()函數(shù)才能完成。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末卸伞,一起剝皮案震驚了整個濱河市抹镊,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌荤傲,老刑警劉巖垮耳,帶你破解...
    沈念sama閱讀 211,817評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡终佛,警方通過查閱死者的電腦和手機俊嗽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來铃彰,“玉大人绍豁,你說我怎么就攤上這事⊙雷剑” “怎么了竹揍?”我有些...
    開封第一講書人閱讀 157,354評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長鹃共。 經(jīng)常有香客問我鬼佣,道長,這世上最難降的妖魔是什么霜浴? 我笑而不...
    開封第一講書人閱讀 56,498評論 1 284
  • 正文 為了忘掉前任晶衷,我火速辦了婚禮,結(jié)果婚禮上阴孟,老公的妹妹穿的比我還像新娘晌纫。我一直安慰自己,他們只是感情好永丝,可當我...
    茶點故事閱讀 65,600評論 6 386
  • 文/花漫 我一把揭開白布锹漱。 她就那樣靜靜地躺著,像睡著了一般慕嚷。 火紅的嫁衣襯著肌膚如雪哥牍。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,829評論 1 290
  • 那天喝检,我揣著相機與錄音嗅辣,去河邊找鬼。 笑死挠说,一個胖子當著我的面吹牛澡谭,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播损俭,決...
    沈念sama閱讀 38,979評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼蛙奖,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了杆兵?” 一聲冷哼從身側(cè)響起雁仲,我...
    開封第一講書人閱讀 37,722評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎琐脏,沒想到半個月后攒砖,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,189評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,519評論 2 327
  • 正文 我和宋清朗相戀三年祭衩,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片阅签。...
    茶點故事閱讀 38,654評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡掐暮,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出政钟,到底是詐尸還是另有隱情路克,我是刑警寧澤,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布养交,位于F島的核電站精算,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏碎连。R本人自食惡果不足惜灰羽,卻給世界環(huán)境...
    茶點故事閱讀 39,940評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望鱼辙。 院中可真熱鬧廉嚼,春花似錦、人聲如沸倒戏。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,762評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽杜跷。三九已至傍念,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間葛闷,已是汗流浹背憋槐。 一陣腳步聲響...
    開封第一講書人閱讀 31,993評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留孵运,地道東北人秦陋。 一個月前我還...
    沈念sama閱讀 46,382評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像治笨,于是被迫代替她去往敵國和親驳概。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,543評論 2 349

推薦閱讀更多精彩內(nèi)容