服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Android - android实现软件自动更新的步骤

android实现软件自动更新的步骤

2022-02-16 16:26HarryWeasley Android

这篇文章主要为大家详细介绍了android实现软件自动更新的步骤,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本篇文章是直接下载最新的APK安装的方法,并不是增量下载该APk。

想要实现一个android应用,自动更新下载APK软件的方法,我采取的是以下几步方法:

1.每次进入主界面时,获取服务器的数据,看是否是最新版本,是,则无操作,否,则进行以下步骤;

2.弹出是否更新软件的对话框,点击下载后

3.弹出下载的进度条的对话框,开始下载,可以上随时点击按钮,停止下载

4.下载完成后,调用系统安装软件的服务,安装软件

效果图:

 android实现软件自动更新的步骤

 android实现软件自动更新的步骤

实现过程:  

新建一个UpdateManager方法,具体内容我已经有详细的注释

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
package lgx.acc.updatedemo;
 
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
 
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.net.Uri;
import android.os.Handler;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.ProgressBar;
import android.widget.TextView;
 
public class UpdateManager {
 // 应用程序Context
 private Context mContext;
 // 是否是最新的应用,默认为false
 private boolean isNew = false;
 private boolean intercept = false;
 // 下载安装包的网络路径
 private String apkUrl = "http://shouji.360tpcdn.com/360sj/tpi/20130201/"
   + "com.flikie.wallpapers.gallery_4.apk";
 // 保存APK的文件夹
 private static final String savePath = "/sdcard/updatedemo/";
 private static final String saveFileName = savePath
   + "UpdateDemoRelease.apk";
 // 下载线程
 private Thread downLoadThread;
 private int progress;// 当前进度
 TextView text;
 // 进度条与通知UI刷新的handler和msg常量
 private ProgressBar mProgress;
 private static final int DOWN_UPDATE = 1;
 private static final int DOWN_OVER = 2;
 
 public UpdateManager(Context context) {
  mContext = context;
 }
 
 /**
  * 检查是否更新的内容
  */
 public void checkUpdateInfo() {
  //这里的isNew本来是要从服务器获取的,我在这里先假设他需要更新
  if (isNew) {
   return;
  } else {
   showUpdateDialog();
  }
 }
 
 /**
  * 显示更新程序对话框,供主程序调用
  */
 private void showUpdateDialog() {
  AlertDialog.Builder builder = new AlertDialog.Builder(mContext);
  builder.setTitle("软件版本更新");
  builder.setMessage("有最新的软件包,请下载!");
  builder.setPositiveButton("下载", new DialogInterface.OnClickListener() {
 
   @Override
   public void onClick(DialogInterface dialog, int which) {
    showDownloadDialog();
   }
 
  });
  builder.setNegativeButton("以后再说",
    new DialogInterface.OnClickListener() {
 
     @Override
     public void onClick(DialogInterface dialog, int which) {
      dialog.dismiss();
     }
    });
 
  builder.create().show();
 }
 
 /**
  * 显示下载进度的对话框
  */
 private void showDownloadDialog() {
  AlertDialog.Builder builder = new AlertDialog.Builder(mContext);
  builder.setTitle("软件版本更新");
  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 DialogInterface.OnClickListener() {
 
   @Override
   public void onClick(DialogInterface dialog, int which) {
    intercept = true;
   }
  });
  builder.show();
  downloadApk();
 }
 
 /**
  * 从服务器下载APK安装包
  */
 private void downloadApk() {
  downLoadThread = new Thread(mdownApkRunnable);
  downLoadThread.start();
 }
 
 private Runnable mdownApkRunnable = new Runnable() {
 
  @Override
  public void run() {
   URL url;
   try {
    url = new URL(apkUrl);
    HttpURLConnection conn = (HttpURLConnection) url
      .openConnection();
    conn.connect();
    int length = conn.getContentLength();
    InputStream ins = conn.getInputStream();
    File file = new File(savePath);
    if (!file.exists()) {
     file.mkdir();
    }
    File apkFile = new File(saveFileName);
    FileOutputStream fos = new FileOutputStream(apkFile);
    int count = 0;
    byte[] buf = new byte[1024];
    while (!intercept) {
     int numread = ins.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);
    }
    fos.close();
    ins.close();
 
   } catch (Exception e) {
    e.printStackTrace();
   }
  }
 };
 
 /**
  * 安装APK内容
  */
 private void installAPK() {
  File apkFile = new File(saveFileName);
  if (!apkFile.exists()) {
   return;
  }
  Intent intent = new Intent(Intent.ACTION_VIEW);
  intent.setDataAndType(Uri.parse("file://" + apkFile.toString()),
    "application/vnd.android.package-archive");
  mContext.startActivity(intent);
 };
 
 private Handler mHandler = new Handler() {
  public void handleMessage(android.os.Message msg) {
   switch (msg.what) {
 
   case DOWN_UPDATE:
    mProgress.setProgress(progress);
    break;
 
   case DOWN_OVER:
    installAPK();
    break;
 
   default:
    break;
   }
  }
 
 };
}

还有progressBar.xml的具体代码

?
1
2
3
4
5
6
7
8
9
10
11
12
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:orientation="vertical" >
 
 <ProgressBar
  android:id="@+id/progress"
  style="?android:attr/progressBarStyleHorizontal"
  android:layout_width="fill_parent"
  android:layout_height="wrap_content" />
</LinearLayout>

 之后在MainActivity的onCreate方法中,调用一下代码即可

?
1
2
UpdateManager manager=new UpdateManager(MainActivity.this);
  manager.checkUpdateInfo();

一定要记得在manifest里面加权限哈,

?
1
2
<uses-permission android:name="android.permission.INTERNET"/>
 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

 最后效果就出来了。

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

原文链接:https://blog.csdn.net/HarryWeasley/article/details/44955719

延伸 · 阅读

精彩推荐
  • AndroidAndroid实现Service获取当前位置(GPS+基站)的方法

    Android实现Service获取当前位置(GPS+基站)的方法

    这篇文章主要介绍了Android实现Service获取当前位置(GPS+基站)的方法,较为详细的分析了Service基于GPS位置的技巧,具有一定参考借鉴价值,需要的朋友可以参考下...

    Ruthless8342021-03-31
  • AndroidAndroid编程解析XML方法详解(SAX,DOM与PULL)

    Android编程解析XML方法详解(SAX,DOM与PULL)

    这篇文章主要介绍了Android编程解析XML方法,结合实例形式详细分析了Android解析XML文件的常用方法与相关实现技巧,需要的朋友可以参考下...

    liuhe68810052021-05-03
  • AndroidAndroid实现固定屏幕显示的方法

    Android实现固定屏幕显示的方法

    这篇文章主要介绍了Android实现固定屏幕显示的方法,实例分析了Android屏幕固定显示所涉及的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下...

    鉴客6192021-03-27
  • AndroidAndroid CardView+ViewPager实现ViewPager翻页动画的方法

    Android CardView+ViewPager实现ViewPager翻页动画的方法

    本篇文章主要介绍了Android CardView+ViewPager实现ViewPager翻页动画的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    Abby代黎明9602022-03-02
  • Android汇总Android视频录制中常见问题

    汇总Android视频录制中常见问题

    这篇文章主要汇总了Android视频录制中常见问题,帮助大家更好地解决Android视频录制中常见的问题,需要的朋友可以参考下...

    yh_thu5192021-04-28
  • AndroidAndroid中AsyncTask详细介绍

    Android中AsyncTask详细介绍

    这篇文章主要介绍了Android中AsyncTask详细介绍,AsyncTask是一个很常用的API,尤其异步处理数据并将数据应用到视图的操作场合,需要的朋友可以参考下...

    Android开发网7452021-03-11
  • AndroidAndroid界面效果UI开发资料汇总(附资料包)

    Android界面效果UI开发资料汇总(附资料包)

    android ui界面设计,友好的界面会提高用户体验度;同时也增强了android ui界面设计的难度,本文提供了一些常用开发资料(有下载哦)感兴趣的朋友可以了解下...

    Android开发网4672021-01-03
  • AndroidAndroid程序设计之AIDL实例详解

    Android程序设计之AIDL实例详解

    这篇文章主要介绍了Android程序设计的AIDL,以一个完整实例的形式较为详细的讲述了AIDL的原理及实现方法,需要的朋友可以参考下...

    Android开发网4642021-03-09