当前位置: 移动技术网 > 移动技术>移动开发>Android > Android应用自动更新功能实现的方法

Android应用自动更新功能实现的方法

2019年07月24日  | 移动技术网移动技术  | 我要评论

本文给大家分享android里应用版本更新功能这一块的实现。

一个好的应用软件都是需要好的维护,从初出版本到最后精品,这个过程需要版本不停的更新,那么如何让用户第一时间获取最新的应用安装包呢?那么就要求我们从第一个版本就要实现升级模块这一功能。

自动更新功能的实现原理,就是我们事先和后台协商好一个接口,我们在应用的主activity里,去访问这个接口,如果需要更新,后台会返回一些数据(比如,提示语;最新版本的url等)。然后我们给出提示框,用户点击开始下载,下载完成开始覆盖安装程序,这样用户的应用就保持最新的拉。

为了让大家容易理解,我像往常一样准备一个小例子,这里为了方便我就省去了和后台交互部分了。步骤分别如下:

第一步:新建一个android工程命名为:updatedemo.代码结构如下图所示

第二步:新建一个updatemanager.java类,负责软件更新功能模块,代码如下:

package com.tutor.update; 
 
import java.io.file; 
import java.io.fileoutputstream; 
import java.io.ioexception; 
import java.io.inputstream; 
import java.net.httpurlconnection; 
import java.net.malformedurlexception; 
import java.net.url; 
 
 
import android.app.alertdialog; 
import android.app.dialog; 
import android.app.alertdialog.builder; 
import android.content.context; 
import android.content.dialoginterface; 
import android.content.intent; 
import android.content.dialoginterface.onclicklistener; 
import android.net.uri; 
import android.os.handler; 
import android.os.message; 
import android.view.layoutinflater; 
import android.view.view; 
import android.widget.progressbar; 
 
public class updatemanager { 
 
 private context mcontext; 
  
 //提示语 
 private string updatemsg = "有最新的软件包哦,亲快下载吧~"; 
  
 //返回的安装包url 
 private string apkurl = "http://softfile.3g.qq.com:8080/msoft/179/24659/43549/qq_hd_mini_1.4.apk"; 
  
  
 private dialog noticedialog; 
  
 private dialog downloaddialog; 
  /* 下载包安装路径 */ 
 private static final string savepath = "/sdcard/updatedemo/"; 
  
 private static final string savefilename = savepath + "updatedemorelease.apk"; 
 
 /* 进度条与通知ui刷新的handler和msg常量 */ 
 private progressbar mprogress; 
 
  
 private static final int down_update = 1; 
  
 private static final int down_over = 2; 
  
 private int progress; 
  
 private thread downloadthread; 
  
 private boolean interceptflag = false; 
  
 private handler mhandler = new handler(){ 
  public void handlemessage(message msg) { 
   switch (msg.what) { 
   case down_update: 
    mprogress.setprogress(progress); 
    break; 
   case down_over: 
     
    installapk(); 
    break; 
   default: 
    break; 
   } 
  }; 
 }; 
  
 public updatemanager(context context) { 
  this.mcontext = context; 
 } 
  
 //外部接口让主activity调用 
 public void checkupdateinfo(){ 
  shownoticedialog(); 
 } 
  
  
 private void shownoticedialog(){ 
  alertdialog.builder builder = new builder(mcontext); 
  builder.settitle("软件版本更新"); 
  builder.setmessage(updatemsg); 
  builder.setpositivebutton("下载", new onclicklistener() {   
   @override 
   public void onclick(dialoginterface dialog, int which) { 
    dialog.dismiss(); 
    showdownloaddialog();    
   } 
  }); 
  builder.setnegativebutton("以后再说", new onclicklistener() {    
   @override 
   public void onclick(dialoginterface dialog, int which) { 
    dialog.dismiss();     
   } 
  }); 
  noticedialog = builder.create(); 
  noticedialog.show(); 
 } 
  
 private void showdownloaddialog(){ 
  alertdialog.builder builder = new builder(mcontext); 
  builder.settitle("软件版本更新"); 
   
  final layoutinflater inflater = layoutinflater.from(mcontext); 
  view v = inflater.inflate(r.layout.progress, null); 
  mprogress = (progressbar)v.findviewbyid(r.id.progress); 
   
  builder.setview(v); 
  builder.setnegativebutton("取消", new onclicklistener() { 
   @override 
   public void onclick(dialoginterface dialog, int which) { 
    dialog.dismiss(); 
    interceptflag = true; 
   } 
  }); 
  downloaddialog = builder.create(); 
  downloaddialog.show(); 
   
  downloadapk(); 
 } 
  
 private runnable mdownapkrunnable = new runnable() {  
  @override 
  public void run() { 
   try { 
    url url = new url(apkurl); 
    
    httpurlconnection conn = (httpurlconnection)url.openconnection(); 
    conn.connect(); 
    int length = conn.getcontentlength(); 
    inputstream is = conn.getinputstream(); 
     
    file file = new file(savepath); 
    if(!file.exists()){ 
     file.mkdir(); 
    } 
    string apkfile = savefilename; 
    file apkfile = new file(apkfile); 
    fileoutputstream fos = new fileoutputstream(apkfile); 
     
    int count = 0; 
    byte buf[] = new byte[1024]; 
     
    do{     
     int numread = is.read(buf); 
     count += numread; 
     progress =(int)(((float)count / length) * 100); 
     //更新进度 
     mhandler.sendemptymessage(down_update); 
     if(numread <= 0){  
      //下载完成通知安装 
      mhandler.sendemptymessage(down_over); 
      break; 
     } 
     fos.write(buf,0,numread); 
    }while(!interceptflag);//点击取消就停止下载. 
     
    fos.close(); 
    is.close(); 
   } catch (malformedurlexception e) { 
    e.printstacktrace(); 
   } catch(ioexception e){ 
    e.printstacktrace(); 
   } 
    
  } 
 }; 
  
  /** 
  * 下载apk 
  * @param url 
  */ 
  
 private void downloadapk(){ 
  downloadthread = new thread(mdownapkrunnable); 
  downloadthread.start(); 
 } 
  /** 
  * 安装apk 
  * @param url 
  */ 
 private void installapk(){ 
  file apkfile = new file(savefilename); 
  if (!apkfile.exists()) { 
   return; 
  }  
  intent i = new intent(intent.action_view); 
  i.setdataandtype(uri.parse("file://" + apkfile.tostring()), "application/vnd.android.package-archive"); 
  mcontext.startactivity(i); 
  
 } 
} 

第三步:在mainactivity.java也就是主activity调用,代码如下:

package com.tutor.update; 
 
import android.app.activity; 
import android.os.bundle; 
 
public class mainacitivity extends activity { 
  
 
 private updatemanager mupdatemanager; 
 @override 
 public void oncreate(bundle savedinstancestate) { 
  super.oncreate(savedinstancestate); 
  setcontentview(r.layout.main); 
   
  //这里来检测版本是否需要更新 
  mupdatemanager = new updatemanager(this); 
  mupdatemanager.checkupdateinfo(); 
 }  
} 

第四步:添加程序所用的资源与权限:
下载的时候用到了progressbar,所以事先写了一个progress.xml布局文件,代码如下:

<?xml version="1.0" encoding="utf-8"?> 
<linearlayout 
 xmlns:android="http://schemas.android.com/apk/res/android" 
 android:layout_width="fill_parent" 
 android:layout_height="wrap_content"> 
 
 <progressbar 
 android:id="@+id/progress" 
 android:layout_width="fill_parent" 
 android:layout_height="wrap_content" 
 style="?android:attr/progressbarstylehorizontal" 
 /> 
</linearlayout> 

下载的时候用到了网络部分,所以要在androidmanifest.xml中添加网络权限,代码如下:
<uses-permission android:name="android.permission.internet" /> 

第五步:运行查看效果如下:

图一:提示有最新包

图二.点击开始下载

图三.下载完开始安装,我这里模拟器空间不足了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持移动技术网。

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网