andriod 自动更新开发

前几天抽空搞了一下android的自动更新功能,没想到很快就被我搞定了! 很有成就感,现在来回顾一下自动更新的开发流程!

      自动更新首先肯定需要服务器,于是在公司的测试服务器上的tomcat中部署了一个文件夹! 里面有两个文件,一个是xml 记录版本号信息,另一个自然就是最新的更新包了!  这是服务器上所必须的!
      有了服务器,就可以开始着手开发客户的代码了,代码在我的小猪音乐里面!  

第一步: 
       更新程序,在第一个activity的onCreate中 调用 检查更新的办法 因为在主线程不允许执行长耗时操作,所以要新建线程
       new Thread(new CheckVersionTask()).start();


       private class CheckVersionTask implements Runnable {
            @Override
            public void run() {
                Looper.prepare();
                Message msg = new Message();
                UpdateManager manager = new UpdateManager(MusicMainActivity.this);
                versionCode=manager.getVersionCode(MusicMainActivity.this);
                if(manager.isUpdate()){//需要更新就更新
                    msg.what = UPDATA_CLIENT;
                    handler.sendMessage(msg);
                }else{
                    msg.what = UPDATA_NONEED;
                    handler.sendMessage(msg);
                }
             
                //manager.checkUpdate();
               
            }
        }
相应的handler 如下:

Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
        // TODO Auto-generated method stub
        super.handleMessage(msg);
        switch (msg.what) {
            case UPDATA_NONEED:
                Toast.makeText(MusicMainActivity.this,"当前版本号为:"+String.valueOf(versionCode)+ " 不需要更新",
                        Toast.LENGTH_SHORT).show();
                break;
            case UPDATA_CLIENT:
        //对话框通知用户升级程序
                showUpdataDialog();
                break;
            case GET_UNDATAINFO_ERROR:
        //服务器超时
                Toast.makeText(MusicMainActivity.this, "获取服务器更新信息失败", 1).show();
                break;
            case DOWN_ERROR:
        //下载apk失败
                Toast.makeText(MusicMainActivity.this, "下载新版本失败", 1).show();
            break;
            }
        }
    };



        联网去访问服务器里面的那个xml文件,读取里面的版本号,和当前版本号对比,如果服务器的版本号高于当前程序版本号,则 出现提示框 提示用户是否 更新!
    //提示是否更新对话框
     private void showUpdataDialog()
        {
         AlertDialog.Builder builder=new AlertDialog.Builder(this);
            builder.setTitle("发现新版本,是否更新?");  //设置标题
            //builder.setIcon(R.drawable.ic_launcher); //设置图标
            builder.setPositiveButton("更新",new DialogInterface.OnClickListener() {
               
                @Override
                public void onClick(DialogInterface arg0, int arg1) {
                    // TODO Auto-generated method stub
                    //Toast.makeText(MusicMainActivity.this, "马上更新", 1).show();
                     downLoadApk();
                }
            }
            ); //设置确定按钮
           
            builder.setNegativeButton("下次再说", new DialogInterface.OnClickListener() {
               
                @Override
                public void onClick(DialogInterface arg0, int arg1) {
                    // TODO Auto-generated method stub
                    //Toast.makeText(MusicMainActivity.this, "好的", 1).show();
                  
                }
            }); //设置取消按钮
            //builder.setView(diaview); //设置自定义的样式
            alertDialog=builder.create(); //生成Alertdialog对话框
            alertDialog.show(); //显示对话框
        }
       当用户选择了开始更新的时候,前台页面需要用到进度条等更新界面,所以用到handler来操作进度条的更新,一边下载,一边更新下载进度当下载完成的时候,就关闭掉进度条的对话框,开始自动安装!安装完后要出现 “完成” 和“打开” 窗口!
 protected void downLoadApk() {
        final ProgressDialog pd; //进度条对话框
        pd = new ProgressDialog(this);
        pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
        pd.setMessage("正在下载更新");
        pd.show();
        new Thread(){
            public void run() {
                try {
                    File file = DownLoadManager.getFileFromServer(updateurl, pd);
                    sleep(2000);
                      installApk(file);
                     pd.dismiss(); //结束掉进度条对话框  } catch (Exception e) {
                }
               catch (Exception e) {
                  Message msg = new Message();
                  msg.what = DOWN_ERROR;
                  handler.sendMessage(msg);
                  e.printStackTrace();
               }
            }
        }.start();
       
    }
 
//安装apk  
     protected void installApk(File file) {
         Intent intent = new Intent();//执行动作  
         intent.setAction(Intent.ACTION_VIEW);//执行的数据类型 
         intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);   //这句话非常关键,没有这句话安装完不会出现完成 和打开页面
         intent.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive");
        // intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
         startActivity(intent);
       
     }
到这里 ,自动更新的功能就完成了,上面用到了两个工具类 ,这里也贴出来吧!

UpdateManager 类

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 java.util.HashMap;

import com.example.mymusic.R;

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.content.pm.PackageManager.NameNotFoundException;
import android.net.Uri;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.ProgressBar;
import android.widget.Toast;

/**
 * @author coolszy
 * @date 2012-4-26
 * @blog http://blog.92coding.com
 */

public class UpdateManager {

    /* 保存解析的XML信息 */
    HashMap<String, String> mHashMap;
    // 服务器地址apk
    private String updateurl = " http://apptest.erke.com:8504/testVersion/MyMusic.apk";
    private String versionurl = " http://apptest.erke.com:8504/testVersion/updateVersion.xml";

    private Context mContext;

    public UpdateManager(Context context) {
        this.mContext = context;
    }

    /**
     * 检查软件是否有更新版本
     *
     * @return
     */
    public boolean isUpdate() {
        // 获取当前软件版本
        int versionCode = getVersionCode(mContext);
        // 把version.xml放到网络上,然后获取文件信息
        System.out.println("当前版本:" + versionCode);

        // InputStream inStream =
        // ParseXmlService.class.getClassLoader().getResourceAsStream("version.xml");
        URL url = null;
        try {
            url = new URL(versionurl);
        } catch (MalformedURLException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
        HttpURLConnection conn = null;
        try {
            conn = (HttpURLConnection) url.openConnection();
        } catch (IOException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
        conn.setConnectTimeout(5000);
        InputStream inStream = null;
        try {
            inStream = conn.getInputStream();
        } catch (IOException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }

        // 解析XML文件。 由于XML文件比较小,因此使用DOM方式进行解析
        ParseXmlService service = new ParseXmlService();
        try {
            mHashMap = service.parseXml(inStream);

        } catch (Exception e) {
            e.printStackTrace();
        }
        if (null != mHashMap) {
            int serviceCode = Integer.valueOf(mHashMap.get("version"));
            // 版本判断
            if (serviceCode > versionCode) {
                System.out.println("检查更新--最新版本" + serviceCode);
                return true;
            }
        }
        return false;
    }

    /**
     * 获取软件版本号
     *
     * @param context
     * @return
     */
    public int getVersionCode(Context context) {
        int versionCode = 0;
        try {
            // 获取软件版本号,对应AndroidManifest.xml下android:versionCode
            versionCode = context.getPackageManager().getPackageInfo(
                    "com.example.mymusic", 0).versionCode;
        } catch (NameNotFoundException e) {
            e.printStackTrace();
        }
        return versionCode;
    }

}


DownLoadManager 类
  

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import android.app.ProgressDialog;
import android.os.Environment;

public class DownLoadManager {
    public static File getFileFromServer(String path, ProgressDialog pd)
            throws Exception {
        // 如果相等的话表示当前的sdcard挂载在手机上并且是可用的
        if (Environment.getExternalStorageState().equals(
                Environment.MEDIA_MOUNTED)) {
            URL url = new URL(path);
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setConnectTimeout(5000);
            // 获取到文件的大小
            pd.setMax(conn.getContentLength());
            InputStream is = conn.getInputStream();
            File file = new File(Environment.getExternalStorageDirectory(),
                    "updata.apk");
            FileOutputStream fos = new FileOutputStream(file);
            BufferedInputStream bis = new BufferedInputStream(is);
            byte[] buffer = new byte[1024];
            int len;
            int total = 0;
            while ((len = bis.read(buffer)) != -1) {
                fos.write(buffer, 0, len);
                total += len;
                // 获取当前下载量
                pd.setProgress(total);
            }
            fos.close();
            bis.close();
            is.close();
            return file;
        } else {
            return null;
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
为了实现Android app的自动更新,可以按照以下步骤进行操作: 1. 首先,需要检测当前应用是否是最新版本。可以通过解析服务器返回的数据来获取最新版本的信息。在解析数据时,可以获取到最新版本的版本号、版本名称、更新内容等。 2. 如果检测到有新版本可用,就需要下载新版本的apk文件。可以使用RxJava和Retrofit等库来处理下载任务。通过创建一个Observable对象来实现下载并监听下载进度。在下载过程中,可以使用进度条来显示下载进度,并将进度以百分比的形式显示在界面上。 3. 在下载过程中,还需要重写onError()和onComplete()方法来处理下载过程中的异常情况。例如,网络异常或服务器异常等情况都需要给用户相应的提示。 4. 下载完成后,需要将下载的apk文件保存至本地。可以使用Android系统提供的权限来获取外部存储的读写权限。 5. 完成以上步骤后,就可以提示用户安装新版本的apk文件。可以使用系统的安装器来安装apk文件,并通过Intent来启动安装过程。 通过以上步骤,就可以实现Android app的自动更新功能。需要注意的是,为了保证用户的数据安全,下载的apk文件需要进行校验。可以使用MD5算法来计算apk文件的MD5值,并与服务器返回的MD5值进行比较,确保下载的apk文件完整性。 以上是一个简要的实现自动更新功能的步骤,具体的实现方式还需要根据具体的项目需求和技术选择来确定。希望对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值