Android程序版本更新之通知欄更新下載安裝
Android應(yīng)用檢查版本更新后,在通知欄下載,更新下載進(jìn)度,下載完成自動安裝,效果圖如下:

•檢查當(dāng)前版本號
AndroidManifest文件中的versionCode用來標(biāo)識版本,在服務(wù)器放一個新版本的apk,versioncode大于當(dāng)前版本,下面代碼用來獲取versioncode的值
PackageInfo packageInfo = context.getPackageManager().getPackageInfo(context.getPackageName(), 0); int localVersion = packageInfo.versionCode;
用當(dāng)前versioncode和服務(wù)端比較,如果小于,就進(jìn)行版本更新
•下載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
<?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>
/**
* 連接網(wǎng)絡(luò),下載一個文件,并傳回進(jìn)度
*
* @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);
// 當(dāng)前進(jìn)度
int schedule = (int) ((file.length() * 100) / length);
// 通知更新進(jìn)度(10,7,4整除才通知,沒必要每次都更新進(jìn)度)
if (temp != schedule
&& (schedule % 10 == 0 || schedule % 4 == 0 || schedule % 7 == 0)) {
// 保證同一個數(shù)據(jù)只發(fā)了一次
temp = schedule;
handler.sendEmptyMessage(schedule);
}
}
out.flush();
out.close();
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}.start();
}
handler根據(jù)下載進(jìn)度進(jìn)行更新
•更新通知欄進(jìn)度條
/**
* 更新通知欄
*/ 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);
}
};
};
下載完成后調(diào)用系統(tǒng)安裝。
•安裝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);
}
安裝完成搞定
- Android實現(xiàn)沉浸式通知欄通知欄背景顏色跟隨app導(dǎo)航欄背景顏色而改變
- Android開發(fā)之禁止下拉通知欄的方法
- android實現(xiàn)通知欄下載更新app示例
- android使用NotificationListenerService監(jiān)聽通知欄消息
- Android開發(fā)之使用通知欄顯示提醒信息的方法
- 關(guān)于Android中點擊通知欄的通知啟動Activity問題解決
- android中創(chuàng)建通知欄Notification代碼實例
- Android實現(xiàn)通知欄透明的方法
- Android不使用自定義布局情況下實現(xiàn)自定義通知欄圖標(biāo)的方法
- Android Fragment實現(xiàn)底部通知欄
相關(guān)文章
淺談onTouch先執(zhí)行,還是onClick執(zhí)行(詳解)
onTouch先執(zhí)行,還是onClick執(zhí)行?下面小編就為大家?guī)硪黄獪\談onTouch先執(zhí)行,還是onClick執(zhí)行(詳解)。希望對大家有所幫助。一起跟隨小編過來看看吧2017-03-03
Android自定義View實現(xiàn)游戲搖桿鍵盤的方法示例
Android進(jìn)階過程中有一個繞不開的話題——自定義View。最近在做項目中又遇到了,所以下面這篇文章主要給大家介紹了利用Android自定義View實現(xiàn)游戲搖桿鍵盤的相關(guān)資料,操作方式類似王者榮耀的搖桿操作,文中通過示例代碼介紹的非常詳細(xì),需要的朋友們下面來一起看看吧。2017-07-07
淺談Android Studio 3.0 工具新特性的使用 Android Profiler 、Device File
這篇文章主要介紹了淺談Android Studio 3.0 工具新特性的使用 Android Profiler 、Device File Explorer的相關(guān)資料,需要的朋友可以參考下2017-11-11
android ListView的右邊滾動滑塊啟用方法 分享
android ListView的右邊滾動滑塊啟用方法 分享,需要的朋友可以參考一下2013-05-05

