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

Android联网更新应用

程序员文章站 2022-11-14 09:31:04
UpdateInfo WelcomeActivity: ......

Android联网更新应用

 

Android联网更新应用

 

UpdateInfo

public class UpdateInfo {
    public String version;//服务器的最新版本值
    public String apkUrl;//最新版本的路径
    public String desc;//版本更新细节
}

WelcomeActivity:

  1 public class WelcomeActivity extends Activity {
  2 
  3     private static final int TO_MAIN = 1;
  4     private static final int DOWNLOAD_VERSION_SUCCESS = 2;
  5     private static final int DOWNLOAD_APK_FAIL = 3;
  6     private static final int DOWNLOAD_APK_SUCCESS = 4;
  7     @Bind(R.id.iv_welcome_icon)
  8     ImageView ivWelcomeIcon;
  9     @Bind(R.id.rl_welcome)
 10     RelativeLayout rlWelcome;
 11     @Bind(R.id.tv_welcome_version)
 12     TextView tvWelcomeVersion;
 13     private boolean connect;
 14     private long startTime;
 15 
 16     private Handler handler = new Handler() {
 17         @Override
 18         public void handleMessage(Message msg) {
 19             switch (msg.what) {
 20                 case TO_MAIN:
 21                     finish();
 22                     startActivity(new Intent(WelcomeActivity.this, MainActivity.class));
 23                     break;
 24                 case DOWNLOAD_VERSION_SUCCESS:
 25                     //获取当前应用的版本信息
 26                     String version = getVersion();
 27                     //更新页面显示的版本信息
 28                     tvWelcomeVersion.setText(version);
 29                     //比较服务器获取的最新的版本跟本应用的版本是否一致
 30                     if(version.equals(updateInfo.version)){
 31                         UIUtils.toast("当前应用已经是最新版本",false);
 32                         toMain();
 33                     }else{
 34                         new AlertDialog.Builder(WelcomeActivity.this)
 35                                     .setTitle("下载最新版本")
 36                                     .setMessage(updateInfo.desc)
 37                                     .setPositiveButton("确定", new DialogInterface.OnClickListener() {
 38                                         @Override
 39                                         public void onClick(DialogInterface dialog, int which) {
 40                                             //下载服务器保存的应用数据
 41                                             downloadApk();
 42                                         }
 43                                     })
 44                                     .setNegativeButton("取消", new DialogInterface.OnClickListener() {
 45                                         @Override
 46                                         public void onClick(DialogInterface dialog, int which) {
 47                                             toMain();
 48                                         }
 49                                     })
 50                                     .show();
 51                     }
 52 
 53                     break;
 54                 case DOWNLOAD_APK_FAIL:
 55                     UIUtils.toast("联网下载数据失败",false);
 56                     toMain();
 57                     break;
 58                 case DOWNLOAD_APK_SUCCESS:
 59                     UIUtils.toast("下载应用数据成功",false);
 60                     dialog.dismiss();
 61                     installApk();//安装下载好的应用
 62                     finish();//结束当前的welcomeActivity的显示
 63                     break;
 64             }
 65 
 66         }
 67     };
 68 
 69     private void installApk() {
 70         Intent intent = new Intent("android.intent.action.INSTALL_PACKAGE");
 71         intent.setData(Uri.parse("file:" + apkFile.getAbsolutePath()));
 72         startActivity(intent);
 73     }
 74 
 75     private ProgressDialog dialog;
 76     private File apkFile;
 77     private void downloadApk() {
 78         //初始化水平进度条的dialog
 79         dialog = new ProgressDialog(this);
 80         dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
 81         dialog.setCancelable(false);
 82         dialog.show();
 83         //初始化数据要保持的位置
 84         File filesDir;
 85         if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
 86             filesDir = this.getExternalFilesDir("");
 87         }else{
 88             filesDir = this.getFilesDir();
 89         }
 90         apkFile = new File(filesDir,"update.apk");
 91 
 92         //启动一个分线程联网下载数据:
 93         new Thread(){
 94             public void run(){
 95                 String path = updateInfo.apkUrl;
 96                 InputStream is = null;
 97                 FileOutputStream fos = null;
 98                 HttpURLConnection conn = null;
 99                 try {
100                     URL url = new URL(path);
101                     conn = (HttpURLConnection) url.openConnection();
102 
103                     conn.setRequestMethod("GET");
104                     conn.setConnectTimeout(5000);
105                     conn.setReadTimeout(5000);
106 
107                     conn.connect();
108 
109                     if(conn.getResponseCode() == 200){
110                         dialog.setMax(conn.getContentLength());//设置dialog的最大值
111                         is = conn.getInputStream();
112                         fos = new FileOutputStream(apkFile);
113 
114                         byte[] buffer = new byte[1024];
115                         int len;
116                         while((len = is.read(buffer)) != -1){
117                             //更新dialog的进度
118                             dialog.incrementProgressBy(len);
119                             fos.write(buffer,0,len);
120 
121                             SystemClock.sleep(1);
122                         }
123 
124                         handler.sendEmptyMessage(DOWNLOAD_APK_SUCCESS);
125 
126                     }else{
127                         handler.sendEmptyMessage(DOWNLOAD_APK_FAIL);
128 
129                     }
130 
131                 } catch (Exception e) {
132                     e.printStackTrace();
133                 }finally{
134                     if(conn != null){
135                         conn.disconnect();
136                     }
137                     if(is != null){
138                         try {
139                             is.close();
140                         } catch (IOException e) {
141                             e.printStackTrace();
142                         }
143                     }
144                     if(fos != null){
145                         try {
146                             fos.close();
147                         } catch (IOException e) {
148                             e.printStackTrace();
149                         }
150                     }
151                 }
152 
153 
154             }
155         }.start();
156 
157 
158     }
159 
160     private UpdateInfo updateInfo;
161 
162     @Override
163     protected void onCreate(Bundle savedInstanceState) {
164         super.onCreate(savedInstanceState);
165 
166         // 去掉窗口标题
167         requestWindowFeature(Window.FEATURE_NO_TITLE);
168         // 隐藏顶部的状态栏
169         getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
170 
171         setContentView(R.layout.activity_welcome);
172         ButterKnife.bind(this);
173 
174 
175         //将当前的activity添加到ActivityManager中
176         ActivityManager.getInstance().add(this);
177         //提供启动动画
178         setAnimation();
179 
180         //联网更新应用
181         updateApkFile();
182 
183     }
184 
185     /**
186      * 当前版本号
187      *
188      * @return
189      */
190     private String getVersion() {
191         String version = "未知版本";
192         PackageManager manager = getPackageManager();
193         try {
194             PackageInfo packageInfo = manager.getPackageInfo(getPackageName(), 0);
195             version = packageInfo.versionName;
196         } catch (PackageManager.NameNotFoundException e) {
197             //e.printStackTrace(); //如果找不到对应的应用包信息, 就返回"未知版本"
198         }
199         return version;
200     }
201 
202     private void updateApkFile() {
203         //获取系统当前时间
204         startTime = System.currentTimeMillis();
205 
206         //1.判断手机是否可以联网
207         boolean connect = isConnect();
208         if (!connect) {//没有移动网络
209             UIUtils.toast("当前没有移动数据网络", false);
210             toMain();
211         } else {//有移动网络
212             //联网获取服务器的最新版本数据
213             AsyncHttpClient client = new AsyncHttpClient();
214             String url = AppNetConfig.UPDATE;
215             client.post(url, new AsyncHttpResponseHandler() {
216                 @Override
217                 public void onSuccess(String content) {
218                     //解析json数据
219                     updateInfo = JSON.parseObject(content, UpdateInfo.class);
220                     handler.sendEmptyMessage(DOWNLOAD_VERSION_SUCCESS);
221                 }
222 
223                 @Override
224                 public void onFailure(Throwable error, String content) {
225                     UIUtils.toast("联网请求数据失败", false);
226                     toMain();
227                 }
228             });
229 
230         }
231     }
232 
233     private void toMain() {
234         long currentTime = System.currentTimeMillis();
235         long delayTime = 3000 - (currentTime - startTime);
236         if (delayTime < 0) {
237             delayTime = 0;
238         }
239 
240 
241         handler.sendEmptyMessageDelayed(TO_MAIN, delayTime);
242     }
243 
244 
245     private void setAnimation() {
246         AlphaAnimation alphaAnimation = new AlphaAnimation(0, 1);//0:完全透明  1:完全不透明
247         alphaAnimation.setDuration(3000);
248         alphaAnimation.setInterpolator(new AccelerateInterpolator());//设置动画的变化率
249 
250         //方式一:
251 //        alphaAnimation.setAnimationListener(new Animation.AnimationListener() {
252 //            @Override
253 //            public void onAnimationStart(Animation animation) {
254 //
255 //            }
256 //            //当动画结束时:调用如下方法
257 //            @Override
258 //            public void onAnimationEnd(Animation animation) {
259 //                Intent intent = new Intent(WelcomeActivity.this,MainActivity.class);
260 //                startActivity(intent);
261 //                finish();//销毁当前页面
262 //            }
263 //
264 //            @Override
265 //            public void onAnimationRepeat(Animation animation) {
266 //
267 //            }
268 //        });
269         //方式二:使用handler
270 //        handler.postDelayed(new Runnable() {
271 //            @Override
272 //            public void run() {
273 //                Intent intent = new Intent(WelcomeActivity.this, MainActivity.class);
274 //                startActivity(intent);
275 ////                finish();//销毁当前页面
276 //                //结束activity的显示,并从栈空间中移除
277 //                ActivityManager.getInstance().remove(WelcomeActivity.this);
278 //            }
279 //        }, 3000);
280 
281         //启动动画
282         rlWelcome.startAnimation(alphaAnimation);
283 
284     }
285 
286     public boolean isConnect() {
287         boolean connected = false;
288 
289         ConnectivityManager manager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
290         NetworkInfo networkInfo = manager.getActiveNetworkInfo();
291         if (networkInfo != null) {
292             connected = networkInfo.isConnected();
293         }
294         return connected;
295     }
296 }