zoukankan      html  css  js  c++  java
  • Android 在线更新apk

    1.获取当前包的信息:

     1 PackageManager manager = Main.this.getPackageManager();
     2 try {
     3     PackageInfo info = manager.getPackageInfo(Main.this.getPackageName(), 0);
     4     String appVersion = info.versionName; // 版本名
     5     currentVersionCode = info.versionCode; // 版本号
     6     System.out.println(currentVersionCode + " " + appVersion);
     7 } catch (NameNotFoundException e) {
     8    // TODO Auto-generated catch blockd
     9    e.printStackTrace();
    10 }
    11 //上面是获取manifest中的版本数据,使用了versionCode
    12 //在从服务器获取到最新版本的versionCode,比较
    13 showUpdateDialog();

    2.直接启动线程进行下载管理并安装:

     1 private void showUpdateDialog() {
     2         AlertDialog.Builder builder = new AlertDialog.Builder(this);
     3         builder.setTitle("检测到新版本");
     4         builder.setMessage("是否下载更新?");
     5         builder.setPositiveButton("更新", new DialogInterface.OnClickListener() {
     6 
     7             @Override
     8             public void onClick(DialogInterface dialog, int which) {
     9                 // TODO Auto-generated method stub11                 showDownloadDialog();
                dialog.dismiss();
    14             }
    15         }).setNegativeButton("稍后更新", new DialogInterface.OnClickListener() {
    16 
    17             @Override
    18             public void onClick(DialogInterface dialog, int which) {
    19                 // TODO Auto-generated method stub
    20          dialog.dismiss();
    21             }
    22         });
    23         builder.show();
    24     }

    3.弹出下载更新进度框,进行apk下载更新:

     1 private void showDownloadDialog(){
     2         AlertDialog.Builder builder = new Builder(mContext);
     3         builder.setTitle("软件版本更新");
     4         
     5         final LayoutInflater inflater = LayoutInflater.from(mContext);
     6         View v = inflater.inflate(R.layout.progress, null);
     7         mProgress = (ProgressBar)v.findViewById(R.id.progress);
     8         
     9         builder.setView(v);
    10         builder.setNegativeButton("取消", new OnClickListener() {    
    11             @Override
    12             public void onClick(DialogInterface dialog, int which) {
    13                 dialog.dismiss();
    14                 interceptFlag = true;
    15             }
    16         });
    17         downloadDialog = builder.create();
    18         downloadDialog.show();
    19         
    20         downloadApk();
    21     }

    4.启动线程进行下载任务:

    1  /**
    2      * 下载apk
    3      */
    4     
    5     private void downloadApk(){
    6         downLoadThread = new Thread(mdownApkRunnable);
    7         downLoadThread.start();
    8     }

    5.对于下载更新进度框的控制:interceptFlag

     1 private Runnable mdownApkRunnable = new Runnable() {    
     2         @Override
     3         public void run() {
     4             try {
     5                 URL url = new URL(apkUrl);
     6             
     7                 HttpURLConnection conn = (HttpURLConnection)url.openConnection();
     8                 conn.connect();
     9                 int length = conn.getContentLength();
    10                 InputStream is = conn.getInputStream();
    11                 
    12                 File file = new File(savePath);
    13                 if(!file.exists()){
    14                     file.mkdir();
    15                 }
    16                 String apkFile = saveFileName;
    17                 File ApkFile = new File(apkFile);
    18                 FileOutputStream fos = new FileOutputStream(ApkFile);
    19                 
    20                 int count = 0;
    21                 byte buf[] = new byte[1024];
    22                 
    23                 do{                      
    24                     int numread = is.read(buf);
    25                     count += numread;
    26                     progress =(int)(((float)count / length) * 100);
    27                     //更新进度
    28                     mHandler.sendEmptyMessage(DOWN_UPDATE);
    29                     if(numread <= 0){    
    30                         //下载完成通知安装
    31                         mHandler.sendEmptyMessage(DOWN_OVER);
    32                         break;
    33                     }
    34                     fos.write(buf,0,numread);
    35                 }while(!interceptFlag);//点击取消就停止下载.
    36                 
    37                 fos.close();
    38                 is.close();
    39             } catch (MalformedURLException e) {
    40                 e.printStackTrace();
    41             } catch(IOException e){
    42                 e.printStackTrace();
    43             }
    44             
    45         }
    46     };

    6.进行提示框进度条更新:

     1 private Handler mHandler = new Handler(){
     2         public void handleMessage(Message msg) {
     3             switch (msg.what) {
     4             case DOWN_UPDATE:
     5                 mProgress.setProgress(progress);
     6                 break;
     7             case DOWN_OVER:
     8                 
     9                 installApk();
    10                 break;
    11             default:
    12                 break;
    13             }
    14         };
    15     };

    7.下载完成,进行apk安装:

     1  /**
     2      * 安装apk
     3      */
     4     private void installApk(){
     5         File apkfile = new File(saveFileName);
     6         if (!apkfile.exists()) {
     7             return;
     8         }    
     9         Intent i = new Intent(Intent.ACTION_VIEW);
    10         i.setDataAndType(Uri.parse("file://" + apkfile.toString()), "application/vnd.android.package-archive"); 
    11         mContext.startActivity(i);
    12     
    13     }
  • 相关阅读:
    2018 ACM 网络选拔赛 徐州赛区
    2018 ACM 网络选拔赛 焦作赛区
    2018 ACM 网络选拔赛 沈阳赛区
    poj 2289 网络流 and 二分查找
    poj 2446 二分图最大匹配
    poj 1469 二分图最大匹配
    poj 3249 拓扑排序 and 动态规划
    poj 3687 拓扑排序
    poj 2585 拓扑排序
    poj 1094 拓扑排序
  • 原文地址:https://www.cnblogs.com/CharlesGrant/p/4773429.html
Copyright © 2011-2022 走看看