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

时间:2022-03-16 13:31:12

本篇文章是直接下载最新的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