在线升级Android应用程序完善版
16lz
2021-01-24
转载请注明出处
发一个完善版本的 思路还是原来的思路,上一篇文章:http://fengzhizi715.iteye.com/blog/792774
不过结合了线程和ProgressBar
代码如下:
效果图如下:
发一个完善版本的 思路还是原来的思路,上一篇文章:http://fengzhizi715.iteye.com/blog/792774
不过结合了线程和ProgressBar
代码如下:
import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.net.HttpURLConnection;import java.net.MalformedURLException;import java.net.URL;import java.util.List;import javax.xml.parsers.ParserConfigurationException;import javax.xml.parsers.SAXParser;import javax.xml.parsers.SAXParserFactory;import org.xml.sax.Attributes;import org.xml.sax.SAXException;import org.xml.sax.helpers.DefaultHandler;import android.app.Activity;import android.app.ActivityManager;import android.app.ActivityManager.RunningAppProcessInfo;import android.content.ComponentName;import android.content.Context;import android.content.Intent;import android.content.pm.ResolveInfo;import android.net.Uri;import android.os.Bundle;import android.os.Environment;import android.os.Handler;import android.os.Message;import android.view.View;import android.widget.ProgressBar;import android.widget.Toast;import com.decarta.db.MapVersionTable;/** * @author Tony Shen * */public class Main extends Activity {private MapVersionTable mDB;private String mapVersion;private String apkUrl;private List<RunningAppProcessInfo> process;private ActivityManager activityMan;private ProgressBar progressBar;private final int CHECK_NEW_VERSION = 1;private final int DOWNLOAD = 2;private final int INSTALL = 3;private final int CHECK_APP = 4;private final int INVOKE_APP = 5;private final int DOWNLOAD_AGAIN = 6;private final int INSTALL_AGAIN = 7;private boolean newVersionFlag = false;private boolean checkAppFlag = false; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); mDB = new MapVersionTable(this); progressBar = (ProgressBar) findViewById(R.id.progressBar); progressBar.setIndeterminate(false); progressBar.setVisibility(View.VISIBLE); progressBar.setMax(100); progressBar.setProgress(0); checkAppFlag = checkApp(); new Thread(new Runnable() {Message msg = new Message();public void run() {try {Thread.sleep(5000);} catch (InterruptedException e) {e.printStackTrace();}msg.what = CHECK_NEW_VERSION;mHandler.sendMessage(msg);try {Thread.sleep(5000);} catch (InterruptedException e) {e.printStackTrace();}if (newVersionFlag) {msg.what = DOWNLOAD;mHandler.sendMessage(msg);try {Thread.sleep(5000);} catch (InterruptedException e) {e.printStackTrace();}msg.what = INSTALL;mHandler.sendMessage(msg);} else {msg.what = CHECK_APP;mHandler.sendMessage(msg);try {Thread.sleep(5000);} catch (InterruptedException e) {e.printStackTrace();}if (checkAppFlag) {msg.what = INVOKE_APP;mHandler.sendMessage(msg);} else {msg.what = DOWNLOAD_AGAIN;mHandler.sendMessage(msg);try {Thread.sleep(5000);} catch (InterruptedException e) {e.printStackTrace();}msg.what = INSTALL_AGAIN;mHandler.sendMessage(msg);}}}}).start(); } private Handler mHandler = new Handler() { public void handleMessage(Message msg) { switch(msg.what){ case CHECK_NEW_VERSION: if(!Thread.currentThread().isInterrupted()){//当前线程正在运行 Toast.makeText(Main.this, "检查更新", Toast.LENGTH_SHORT).show(); newVersionFlag = checkNewVersion(); progressBar.setProgress(30); } break; case DOWNLOAD: if(!Thread.currentThread().isInterrupted()){//当前线程正在运行 Toast.makeText(Main.this, "下载更新", Toast.LENGTH_SHORT).show(); downloadAPK(apkUrl); progressBar.setProgress(60); } break; case INSTALL: if(!Thread.currentThread().isInterrupted()){//当前线程正在运行 Toast.makeText(Main.this, "安装更新", Toast.LENGTH_SHORT).show(); killProcess(); progressBar.setProgress(100); installAPK(); finish(); } break; case CHECK_APP: if(!Thread.currentThread().isInterrupted()){//当前线程正在运行 Toast.makeText(Main.this, "检查应用", Toast.LENGTH_SHORT).show();// checkAppFlag = checkApp(); progressBar.setProgress(60); } break; case INVOKE_APP: if(!Thread.currentThread().isInterrupted()){//当前线程正在运行 Toast.makeText(Main.this, "程序启动", Toast.LENGTH_SHORT).show(); progressBar.setProgress(100); invokeAPK(); finish(); } break; case DOWNLOAD_AGAIN: if(!Thread.currentThread().isInterrupted()){//当前线程正在运行 Toast.makeText(Main.this, "下载更新", Toast.LENGTH_SHORT).show(); progressBar.setProgress(80); downloadAPK(apkUrl); } break; case INSTALL_AGAIN: if(!Thread.currentThread().isInterrupted()){//当前线程正在运行 Toast.makeText(Main.this, "安装更新", Toast.LENGTH_SHORT).show(); progressBar.setProgress(100); installAPK(); finish(); } break; default: progressBar.setVisibility(View.GONE); Thread.currentThread().interrupt();//中断当前线程. break; } super.handleMessage(msg); } };private boolean checkNewVersion() {try {URL url=new URL(AppConfig.SERVLET_URL);SAXParserFactory factory=SAXParserFactory.newInstance();factory.setNamespaceAware(true);factory.setValidating(false); SAXParser parser=factory.newSAXParser(); InputStream is = url.openStream(); parser.parse(is, new DefaultHandler(){private String cur="";private int step;@Overridepublic void startDocument() throws SAXException {step = 0;}@Overridepublic void startElement(String uri, String localName,String qName, Attributes attributes)throws SAXException {cur = localName;}@Overridepublic void characters(char[] ch, int start, int length)throws SAXException {String str = new String(ch, start, length).trim();if (str == null || str.equals(""))return;if (cur.equals("url")) {apkUrl = str;}if (cur.equals("map_version")) {mapVersion = str;}}@Overridepublic void endElement(String uri, String localName,String qName) throws SAXException {step = step + 1;}@Overridepublic void endDocument() throws SAXException {super.endDocument();}});} catch (MalformedURLException e) {e.printStackTrace();} catch (ParserConfigurationException e) {e.printStackTrace();} catch (SAXException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}if (diffVersion(mapVersion)) return true;elsereturn false;}private boolean diffVersion(String mapVersion) {String lastVersion = mDB.getLastMapVersion();if (lastVersion == null) {mDB.setMapVersion(mapVersion);return true;}if (!lastVersion.equals(mapVersion)) {mDB.setMapVersion(mapVersion);return true;}elsereturn false;}private void downloadAPK(String apkUrl) {String filePath = "//sdcard//download//" + AppConfig.APKNAME;URL url = null;try {url = new URL(apkUrl);HttpURLConnection con = (HttpURLConnection) url.openConnection();InputStream in = con.getInputStream();File fileOut = new File(filePath);FileOutputStream out = new FileOutputStream(fileOut);byte[] bytes = new byte[1024];int c;while ((c = in.read(bytes)) != -1) {out.write(bytes, 0, c);}in.close();out.close();} catch (Exception e) {e.printStackTrace();}}private void killProcess() {activityMan = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);process = activityMan.getRunningAppProcesses();int len = process.size();for(int i = 0;i<len;i++) {if (process.get(i).processName.equals(AppConfig.PKG)) {android.os.Process.killProcess(process.get(i).pid);}}}private void installAPK() {String fileName = getSDPath() +"/download/"+AppConfig.APKNAME;Intent intent = new Intent(Intent.ACTION_VIEW);intent.setDataAndType(Uri.fromFile(new File(fileName)), "application/vnd.android.package-archive");startActivity(intent);}private void invokeAPK() {Intent i=new Intent();i.setComponent(new ComponentName(AppConfig.PKG, AppConfig.CLS));startActivity(i);}private boolean checkApp() {Intent intent = new Intent(Intent.ACTION_VIEW); intent.setClassName("com.android.settings", "com.android.settings.InstalledAppDetails"); intent.putExtra("com.android.settings.ApplicationPkgName", AppConfig.APKNAME); List<ResolveInfo> acts = getPackageManager().queryIntentActivities( intent, 0); if (acts.size() > 0)return true;elsereturn false;}private String getSDPath() {File sdDir = null;boolean sdCardExist = Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED); // determine whether sd card is existif (sdCardExist) {sdDir = Environment.getExternalStorageDirectory();// get the root directory}return sdDir.toString();}@Overridepublic void finish() {super.finish();Thread.currentThread().interrupt();//中断当前线程. }@Overrideprotected void onDestroy() {super.onDestroy();try { mDB.close(); // be sure to close} catch (Exception e) {}}}
效果图如下:
更多相关文章
- Android(安卓)handler src track
- Android(安卓)-HandleThread-给线程传参数
- Android(安卓)APK+Dex文件反编译及回编译工具
- Android(安卓)更新ProgressBar
- android 自定义Dialog弹出提示框
- android线程间通信和主线程更新ui
- Android下的JNI创建多线程的方法
- 理解杀进程的实现原理
- Android开发:关于Android冷启动优化(从3.63%降到0.95%)