android版本更新出现重复下载安装,Android程序版本更新之通知栏更新下载安装

Android应用检查版本更新后,在通知栏下载,更新下载进度,下载完成自动安装,效果图如下:

0f660a799661390bf2a2cae2260a4adf.png

•检查当前版本号

AndroidManifest文件中的versionCode用来标识版本,在服务器放一个新版本的apk,versioncode大于当前版本,下面代码用来获取versioncode的值

PackageInfo packageInfo = context.getPackageManager().getPackageInfo(context.getPackageName(), 0);

int localVersion = packageInfo.versionCode;

用当前versioncode和服务端比较,如果小于,就进行版本更新

•下载apk文件

/**

* 下载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

android:layout_width="match_parent"

android:layout_height="match_parent"

android:layout_marginLeft="10dp"

android:background="#00000000"

android:padding="5dp" >

android:id="@+id/notify_icon_iv"

android:layout_width="25dp"

android:layout_height="25dp"

android:src="@drawable/ic_launcher" />

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" />

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" />

/**

* 连接网络,下载一个文件,并传回进度

*

* @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

/**

* 安装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);

}

安装完成搞定

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值