android应用检查版本更新后,在通知栏下载,更新下载进度,下载完成自动安装,效果图如下:
•检查当前版本号
androidmanifest文件中的versioncode用来标识版本,在服务器放一个新版本的apk,versioncode大于当前版本,下面代码用来获取versioncode的值
1
2
|
packageinfo packageinfo = context.getpackagemanager().getpackageinfo(context.getpackagename(), 0 ); int localversion = packageinfo.versioncode; |
用当前versioncode和服务端比较,如果小于,就进行版本更新
•下载apk文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
/** * 下载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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
|
<?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根据下载进度进行更新
•更新通知栏进度条
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
/** * 更新通知栏 */ 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
1
2
3
4
5
6
7
8
9
10
11
12
|
/** * 安装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); } |
安装完成搞定