在Andrdoid程序中常常会有一个版本更新的功能,它的实现非常简单,就是讲新版本的apk文件上传到服务器,然后修改服务器中的版本号,这样当用户点击版本更新的时候就可以下载新版本的apk文件了,下面说一下是如何下载并安装apk文件的:
public class UpdateActivity extends AppCompatActivity { private Button button1; private static String URL_STRING = "";//下载文件的地址 private static int down = 0;//状态码 File file; private Handler handler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch (msg.what) { case 1: button1.setText("点击安装"); down = 1; break; case 2: down = 2; button1.setText("打开"); break; } } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_update); String apk = getIntent().getStringExtra("apk"); String path = "http://59.110.12.225:8080/szcb.admin"; URL_STRING = path + apk; //调用手机中的浏览器下载 // Uri uri = Uri.parse(path+apk); // Intent intent = new Intent(Intent.ACTION_VIEW, uri); // startActivity(intent); button1 = (Button) findViewById(R.id.button1); button1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 下载apk if (down == 0) { downFile(URL_STRING); button1.setText("正在下载"); // 安装APK } else if (down == 1) { installApk(); // 打开apk } else if (down == 2) { openApk(UpdateActivity.this, URL_STRING); } } }); } // 接收到安装完成apk的广播 BroadcastReceiver broadcastReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { System.out.println("接收到安装完成apk的广播"); Message message = handler.obtainMessage(); message.what = 2; handler.sendMessage(message); } }; /** * 后台在下面一个Apk 下载完成后返回下载好的文件 * * @param httpUrl * @return */ private File downFile(final String httpUrl) { new Thread(new Runnable() { @Override public void run() { try { URL url = new URL(httpUrl); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("GET"); connection.setConnectTimeout(5000); FileOutputStream fileOutputStream = null; InputStream inputStream; if (connection.getResponseCode() == 200) { inputStream = connection.getInputStream(); if (inputStream != null) { file = getFile(httpUrl); fileOutputStream = new FileOutputStream(file); byte[] buffer = new byte[1024]; int length = 0; while ((length = inputStream.read(buffer)) != -1) { fileOutputStream.write(buffer, 0, length); } fileOutputStream.close(); fileOutputStream.flush(); } inputStream.close(); } //Log.e("Mr.Kang", "run: "+"下载完成"); // 往handler发送一条消息 更改button的text属性 Message message = handler.obtainMessage(); message.what = 1; handler.sendMessage(message); } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }).start(); return file; } /** * 安装APK */ private void installApk() { Intent intent = new Intent(Intent.ACTION_VIEW); intent.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive"); startActivity(intent); } @Override protected void onStart() { super.onStart(); IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction(Intent.ACTION_PACKAGE_ADDED); intentFilter.addDataScheme("package"); // 注册一个广播 registerReceiver(broadcastReceiver, intentFilter); } @Override protected void onDestroy() { super.onDestroy(); // 解除广播 unregisterReceiver(broadcastReceiver); } /** * 打开已经安装好的apk */ private void openApk(Context context, String url) { PackageManager manager = context.getPackageManager(); // 这里的是你下载好的文件路径 PackageInfo info = manager.getPackageArchiveInfo(Environment.getExternalStorageDirectory().getAbsolutePath() + getFilePath(url), PackageManager.GET_ACTIVITIES); if (info != null) { Intent intent = manager.getLaunchIntentForPackage(info.applicationInfo.packageName); startActivity(intent); } } /** * 根据传过来url创建文件 */ private File getFile(String url) { File files = new File(Environment.getExternalStorageDirectory().getAbsoluteFile(), getFilePath(url)); return files; } /** * 截取出url后面的apk的文件名 * @param url * @return */ private String getFilePath(String url) { return url.substring(url.lastIndexOf("/"), url.length()); } }