zl程序教程

您现在的位置是:首页 >  移动开发

当前栏目

Android软件自动更新功能实现的方法

Android方法软件 实现 功能 自动更新
2023-06-13 09:14:50 时间

相信所有的用户都遇到过软件提醒更新的情况,下面就将实现此功能

首先看一下程序目录结构

  

步骤:

1、新建一个类UpdateManger,用于显示提示更新

复制代码代码如下:

publicclassUpdateManger{
 //应用程序Context
 privateContextmContext;
 //提示消息
 privateStringupdateMsg="有最新的软件包,请下载!";
 //下载安装包的网络路径
 privateStringapkUrl="http://softfile.3g.qq.com:8080/msoft/179/24659/43549/qq_hd_mini_1.4.apk";
 privateDialognoticeDialog;//提示有软件更新的对话框
 privateDialogdownloadDialog;//下载对话框
 privatestaticfinalStringsavePath="/sdcard/updatedemo/";//保存apk的文件夹
 privatestaticfinalStringsaveFileName=savePath+"UpdateDemoRelease.apk";
 //进度条与通知UI刷新的handler和msg常量
 privateProgressBarmProgress;
 privatestaticfinalintDOWN_UPDATE=1;
 privatestaticfinalintDOWN_OVER=2;

 privateintprogress;//当前进度
 privateThreaddownLoadThread;//下载线程
 privatebooleaninterceptFlag=false;//用户取消下载
 //通知处理刷新界面的handler
 privateHandlermHandler=newHandler(){
  @SuppressLint("HandlerLeak")
  @Override
  publicvoidhandleMessage(Messagemsg){
   switch(msg.what){
   caseDOWN_UPDATE:
    mProgress.setProgress(progress);
    break;
   caseDOWN_OVER:
    installApk();
    break;
   }
   super.handleMessage(msg);
  }
 };
 publicUpdateManger(Contextcontext){
  this.mContext=context;
 }
 //显示更新程序对话框,供主程序调用
 publicvoidcheckUpdateInfo(){
  showNoticeDialog();
 }
 privatevoidshowNoticeDialog(){
  android.app.AlertDialog.Builderbuilder=newandroid.app.AlertDialog.Builder(
    mContext);//Builder,可以通过此builder设置改变AleartDialog的默认的主题样式及属性相关信息
  builder.setTitle("软件版本更新");
  builder.setMessage(updateMsg);
  builder.setPositiveButton("下载",newOnClickListener(){
   @Override
   publicvoidonClick(DialogInterfacedialog,intwhich){
    dialog.dismiss();//当取消对话框后进行操作一定的代码?取消对话框
    showDownloadDialog();
   }
  });
  builder.setNegativeButton("以后再说",newOnClickListener(){
   @Override
   publicvoidonClick(DialogInterfacedialog,intwhich){
    dialog.dismiss();
   }
  });
  noticeDialog=builder.create();
  noticeDialog.show();
 }
 protectedvoidshowDownloadDialog(){
  android.app.AlertDialog.Builderbuilder=newandroid.app.AlertDialog.Builder(mContext);
  builder.setTitle("软件版本更新");
  finalLayoutInflaterinflater=LayoutInflater.from(mContext);
  Viewv=inflater.inflate(R.layout.progress,null);

  mProgress=(ProgressBar)v.findViewById(R.id.progress);
  builder.setView(v);//设置对话框的内容为一个View
  builder.setNegativeButton("取消",newOnClickListener(){
   @Override
   publicvoidonClick(DialogInterfacedialog,intwhich){
    dialog.dismiss();
    interceptFlag=true;
   }
  });
  downloadDialog=builder.create();
  downloadDialog.show();
  downloadApk();
 }
 privatevoiddownloadApk(){
  downLoadThread=newThread(mdownApkRunnable);
  downLoadThread.start();
 }
 protectedvoidinstallApk(){
  Fileapkfile=newFile(saveFileName);
  if(!apkfile.exists()){
   return;
  }
  Intenti=newIntent(Intent.ACTION_VIEW);
  i.setDataAndType(Uri.parse("file://"+apkfile.toString()),
    "application/vnd.android.package-archive");//File.toString()会返回路径信息
  mContext.startActivity(i);
 }
 privateRunnablemdownApkRunnable=newRunnable(){
  @Override
  publicvoidrun(){
   URLurl;
   try{
    url=newURL(apkUrl);
    HttpURLConnectionconn=(HttpURLConnection)url.openConnection();
    conn.connect();
    intlength=conn.getContentLength();
    InputStreamins=conn.getInputStream();

    Filefile=newFile(savePath);
    if(!file.exists()){
     file.mkdir();
    }
    StringapkFile=saveFileName;
    FileApkFile=newFile(apkFile);
    FileOutputStreamoutStream=newFileOutputStream(ApkFile);
    intcount=0;
    bytebuf[]=newbyte[1024];
    do{
     intnumread=ins.read(buf);
     count+=numread;
     progress=(int)(((float)count/length)*100);
     //下载进度
     mHandler.sendEmptyMessage(DOWN_UPDATE);
     if(numread<=0){
      //下载完成通知安装
      mHandler.sendEmptyMessage(DOWN_OVER);
      break;
     }
     outStream.write(buf,0,numread);
    }while(!interceptFlag);//点击取消停止下载
    outStream.close();
    ins.close();
   }catch(Exceptione){
    e.printStackTrace();
   }
  }
 };
}

2、新建一个xml文件,用于定义下载过程中的ProgressBar的进度显示,名为progress.xml
复制代码代码如下:

<?xmlversion="1.0"encoding="utf-8"?>
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content">

<ProgressBar
android:id="@+id/progress"
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content"/>

</LinearLayout>


3、在MainActivity中onCreate()方法中,进行软件更新的检测

mUpdateManger=newUpdateManger(MainActivity.this);//注意此处不能传入getApplicationContext();会报错,因为只有是一个Activity才可以添加窗体
mUpdateManger.checkUpdateInfo();

并且在配置清单文件中添加网络权限 <uses-permissionandroid:name="android.permission.INTERNET"/>

4、运行程序

--点击下载-->