Android联网更新应用

 

 

UpdateInfoandroid

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

WelcomeActivity:json

 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 }
相关文章
相关标签/搜索