admin管理员组文章数量:1597508
先来看看要实现的效果图:
对于安卓用户来说,手机应用市场说满天飞可是一点都不夸张,比如小米,魅族,百度,360,机锋,应用宝等等,当我们想上线一款新版本APP时,先不说渠道打包的麻烦,单纯指上传APP到各大应用市场的工作量就已经很大了,好不容易我们把APP都上传完了,突然发现一个会导致应用闪退的小Bug,这时那个崩溃啊,明明不是很大的改动,难道我们还要再去重新去把各大应用市场的版本再上传更新一次?相信我,运营人员肯定会弄死你的!!
有问题,自然就会有解决问题的方案,因此我们就会想到如果在APP里内嵌自动更新的功能,那么我们将可以省去很多麻烦,当然关于这方面功能的第三方SDK有很多。
好了,言归正传,今天我们自己来实现下关于APP自动更新。
流程其实并不复杂:当用户打开APP的时候,我们让APP去发送一个检查版本的网络请求,或者利用服务端向APP推送一个透传消息来检查APP的版本,如果当前APP版本比服务器上的旧,那么我们就提醒用户进行下载更新APP,当然在特定的情况下,我们也可以强制的让用户去升级,当然这是很不友好的,尽可能的减少这样的做法。
好了,来梳理下流程,首先既然是一个APP的更新,那么我们就需要去下载新的APP,然后我们需要一个通知来告诉用户当前的下载进度,再来当APP安装包下载完成后,我们需要去系统的安装程序来对APP进行安装更新。
知识点:
下载:异步HTTP请求文件下载,并监听当前下载进度(这里我采用了okhttp)
通知:Notification(具体用法请自行翻阅API文档)
安装:Intent (具体用法请自行翻阅API文档)
来看下具体实现代码:
我们需要一个后台服务来支撑App的下载
?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 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 |
import
android.app.Notification;
import
android.app.NotificationManager;
import
android.app.PendingIntent;
import
android.app.Service;
import
android.content.Intent;
import
android.graphics.BitmapFactory;
import
android.Uri;
import
android.os.IBinder;
import
android.support.annotation.Nullable;
import
android.support.v7.app.NotificationCompat;
import
com.fangkumonlibrary.utils.StorageUtil;
import
com.zhy.http.okhttp.OkHttpUtils;
import
com.zhy.http.okhttp.callback.FileCallBack;
import
java.io.File;
import
okhttp3.Call;
/**
* 自动下载更新apk服务
* Create by: chenwei.li
* Date: 2016-08-14
* time: 09:50
* Email: lichenwei.me@foxmail
*/
public
class
DownloadService
extends
Service {
private
String mDownloadUrl;
//APK的下载路径
private
NotificationManager mNotificationManager;
private
Notification mNotification;
@Override
public
void
onCreate() {
super
.onCreate();
mNotificationManager = (NotificationManager) getSystemService(Service.NOTIFICATION_SERVICE);
}
@Override
public
int
onStartCommand(Intent intent,
int
flags,
int
startId) {
if
(intent ==
null
) {
notifyMsg(
"温馨提醒"
,
"文件下载失败"
,
0
);
stopSelf();
}
mDownloadUrl = intent.getStringExtra(
"apkUrl"
);
//获取下载APK的链接
downloadFile(mDownloadUrl);
//下载APK
return
super
.onStartCommand(intent, flags, startId);
}
@Nullable
@Override
public
IBinder onBind(Intent intent) {
return
null
;
}
private
void
notifyMsg(String title, String content,
int
progress) {
NotificationCompat.Builder builder =
new
NotificationCompat.Builder(
this
);
//为了向下兼容,这里采用了v7包下的NotificationCompat来构造
builder.setSmallIcon(R.mipmap.icon_login_logo).setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.icon_login_logo)).setContentTitle(title);
if
(progress >
0
&& progress <
100
) {
//下载进行中
builder.setProgress(
100
, progress,
false
);
}
else
{
builder.setProgress(
0
,
0
,
false
);
}
builder.setAutoCancel(
true
);
builder.setWhen(System.currentTimeMillis());
builder.setContentText(content);
if
(progress >=
100
) {
//下载完成
builder.setContentIntent(getInstallIntent());
}
mNotification = builder.build();
mNotificationManager.notify(
0
, mNotification);
}
/**
* 安装apk文件
*
* @return
*/
private
PendingIntent getInstallIntent() {
File file =
new
File(StorageUtil.DOWNLOAD_DIR +
"APP文件名"
);
Intent intent =
new
Intent(Intent.ACTION_VIEW);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setDataAndType(Uri.parse(
"file://"
+ file.getAbsolutePath()),
"application/vnd.android.package-archive"
);
PendingIntent pendingIntent = PendingIntent.getActivity(
this
,
0
, intent, PendingIntent.FLAG_UPDATE_CURRENT);
return
pendingIntent;
}
/**
* 下载apk文件
*
* @param url
*/
private
void
downloadFile(String url) {
OkHttpUtils.get().url(url).build().execute(
new
FileCallBack(StorageUtil.DOWNLOAD_DIR,
"APP文件名"
) {
@Override
public
void
onError(Call call, Exception e,
int
id) {
notifyMsg(
"温馨提醒"
,
"文件下载失败"
,
0
);
stopSelf();
}
@Override
public
void
onResponse(File response,
int
id) {
//当文件下载完成后回调
notifyMsg(
"温馨提醒"
,
"文件下载已完成"
,
100
);
stopSelf();
}
@Override
public
void
inProgress(
float
progress,
long
total,
int
id) {
//progress*100为当前文件下载进度,total为文件大小
if
((
int
) (progress *
100
) %
10
==
0
) {
//避免频繁刷新View,这里设置每下载10%提醒更新一次进度
notifyMsg(
"温馨提醒"
,
"文件正在下载.."
, (
int
) (progress *
100
));
}
}
});
}
}
|
然后我们只需要在我们想要的更新APP的时候去调起这个服务即可,比如在系统设置里的"版本检查"等
?1 2 3 |
Intent intent =
new
Intent(mContext, DownloadService.
class
);
intent.putExtra(
"apkUrl"
,
"APK下载地址"
);
startService(intent);
|
总结
这里我只是粗略演示本地自动更新APP的功能,在实际应用中,我们应该配合服务端来做,比如在用户启动APP的时候去比对版本号,如果版本号低于服务器的版本号,那么此时服务端应该给客户端一个透传推送,这里的推送内容应该为新版本APP的下载地址,此时就可以根据该地址来下载新版APP了,当遇到重大更新,不再对老版本进行兼容的时候,可以强制用户升级,这里的方案有很多,比如调用系统级对话框,让用户没办法取消等操作,这里就不做更多描述。以上就是这篇文章的全部内容,希望对有需要的人能有所帮助。版权声明:本文标题:Android如何实现APP自动更新 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://www.elefans.com/xitong/1728280131a1151725.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论