Android应用检查版本更新后,在通知栏下载,更新下载进度,下载完成自动安装,效果图如下:
AndroidManifest文件中的versionCode用来标识版本,在服务器放一个新版本的apk,versioncode大于当前版本,下面代码用来获取versioncode的值
- PackageInfo packageInfo = context.getPackageManager().getPackageInfo(context.getPackageName(), 0);
- int localVersion = packageInfo.versionCode;
用当前versioncode和服务端比较,如果小于,就进行版本更新
- /**
- * 下载apk
- *
- * @param apkUri
- */
private void downLoadNewApk(String apkUri, String version) {- manager = (NotificationManager) context
- .getSystemService((context.NOTIFICATION_SERVICE));
- notify = new Notification();
- notify.icon = R.drawable.ic_launcher;
- // 通知栏显示所用到的布局文件
- notify.contentView = new RemoteViews(context.getPackageName(),
- R.layout.view_notify_item);
- manager.notify(100, notify);
- //建立下载的apk文件
- File fileInstall = FileOperate.mkdirSdcardFile("downLoad", APK_NAME
- + version + ".apk");
- downLoadSchedule(apkUri, completeHandler, context,
- fileInstall);
- }
- FileOperate是自己写的文件工具类
通知栏显示的布局,view_notify_item.xml
- <?xml version="1.0" encoding="utf-8"?>
- <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:layout_marginLeft="10dp"
- android:background="#00000000"
- android:padding="5dp" >
- <ImageView
- android:id="@+id/notify_icon_iv"
- android:layout_width="25dp"
- android:layout_height="25dp"
- android:src="@drawable/ic_launcher" />
- <TextView
- android:id="@+id/notify_updata_values_tv"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_centerHorizontal="true"
- android:layout_marginBottom="6dp"
- android:layout_marginLeft="15dp"
- android:layout_marginTop="5dp"
- android:layout_toRightOf="@id/notify_icon_iv"
- android:gravity="center_vertical"
- android:text="0%"
- android:textColor="@color/white"
- android:textSize="12sp" />
- <ProgressBar
- android:id="@+id/notify_updata_progress"
- style="@android:style/Widget.ProgressBar.Horizontal"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:layout_below="@id/notify_icon_iv"
- android:layout_marginTop="4dp"
- android:max="100" />
- </RelativeLayout>
- /**
- * 连接网络,下载一个文件,并传回进度
- *
- * @param uri
- * @param handler
- * @param context
- * @param file
- */
public static void downLoadSchedule(final String uri,- final Handler handler, Context context, final File file) {
- if (!file.exists()) {
- handler.sendEmptyMessage(-1);
- return;
- }
- // 每次读取文件的长度
- final int perLength = 4096;
- new Thread() {
- @Override
- public void run() {
- super.run();
- try {
- URL url = new URL(uri);
- HttpURLConnection conn = (HttpURLConnection) url
- .openConnection();
- conn.setDoInput(true);
- conn.connect();
- InputStream in = conn.getInputStream();
- // 2865412
- long length = conn.getContentLength();
- // 每次读取1k
- byte[] buffer = new byte[perLength];
- int len = -1;
- FileOutputStream out = new FileOutputStream(file);
- int temp = 0;
- while ((len = in.read(buffer)) != -1) {
- // 写入文件
- out.write(buffer, 0, len);
- // 当前进度
- int schedule = (int) ((file.length() * 100) / length);
- // 通知更新进度(10,7,4整除才通知,没必要每次都更新进度)
- if (temp != schedule
- && (schedule % 10 == 0 || schedule % 4 == 0 || schedule % 7 == 0)) {
- // 保证同一个数据只发了一次
- temp = schedule;
- handler.sendEmptyMessage(schedule);
- }
- }
- out.flush();
- out.close();
- in.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }.start();
- }
handler根据下载进度进行更新
- /**
- * 更新通知栏
- */
private Handler completeHandler = new Handler() {- public void handleMessage(android.os.Message msg) {
- // 更新通知栏
- if (msg.what < 100) {
- notify.contentView.setTextViewText(
- R.id.notify_updata_values_tv, msg.what + "%");
- notify.contentView.setProgressBar(R.id.notify_updata_progress,
- 100, msg.what, false);
- manager.notify(100, notify);
- } else {
- notify.contentView.setTextViewText(
- R.id.notify_updata_values_tv, "下载完成");
- notify.contentView.setProgressBar(R.id.notify_updata_progress,
- 100, msg.what, false);// 清除通知栏
- manager.cancel(100);
- installApk(fileInstall);
- }
- };
- };
下载完成后调用系统安装。
- /**
- * 安装apk
- *
- * @param file
- */
private void installApk(File file) {- Intent intent = new Intent();
- intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- intent.setAction(android.content.Intent.ACTION_VIEW);
- intent.setDataAndType(Uri.fromFile(file),
- "application/vnd.android.package-archive");
- context.startActivity(intent);
- }
安装完成搞定