欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

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

程序员文章站 2024-03-04 11:22:17
本文给大家分享android里应用版本更新功能这一块的实现。 一个好的应用软件都是需要好的维护,从初出版本到最后精品,这个过程需要版本不停的更新,那么如何让用户第一时间获...

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

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

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

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

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

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

第二步:新建一个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" /> 

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

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

图一:提示有最新包

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

图二.点击开始下载

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

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

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