对于安卓用户来说,手机应用市场说满天飞可是一点都不夸张,比如小米,魅族,百度,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. import android.app.Notification;
  2. import android.app.notificationmanager;
  3. import android.app.PendingIntent;
  4. import android.app.Service;
  5. import android.content.Intent;
  6. import android.graphics.BitmapFactory;
  7. import android.net.Uri;
  8. import android.os.IBinder;
  9. import android.support.annotation.Nullable;
  10. import android.support.v7.app.NotificationCompat;
  11. import com.fangku.commonlibrary.utils.StorageUtil;
  12. import com.zhy.http.okhttp.OkHttpUtils;
  13. import com.zhy.http.okhttp.callback.FileCallBack;
  14. import java.io.File;
  15. import okhttp3.Call;
  16. /**
  17. * 自动下载更新apk服务
  18. * Create by: chenwei.li
  19. * Date: 2016-08-14
  20. * time: 09:50
  21. * Email: lichenwei.me@foxmail.com
  22. */
  23. public class DownloadService extends Service {
  24. private String mDownloadUrl;//APK的下载路径
  25. private notificationmanager mnotificationmanager;
  26. private Notification mNotification;
  27. @Override
  28. public void onCreate() {
  29. super.onCreate();
  30. mnotificationmanager = (notificationmanager) getSystemService(Service.NOTIFICATION_SERVICE);
  31. }
  32. @Override
  33. public int onStartCommand(Intent intent,int flags,int startId) {
  34. if (intent == null) {
  35. notifyMsg("温馨提醒","文件下载失败",0);
  36. stopSelf();
  37. }
  38. mDownloadUrl = intent.getStringExtra("apkUrl");//获取下载APK的链接
  39. downloadFile(mDownloadUrl);//下载APK
  40. return super.onStartCommand(intent,flags,startId);
  41. }
  42. @Nullable
  43. @Override
  44. public IBinder onBind(Intent intent) {
  45. return null;
  46. }
  47. private void notifyMsg(String title,String content,int progress) {
  48. NotificationCompat.Builder builder = new NotificationCompat.Builder(this);//为了向下兼容,这里采用了v7包下的NotificationCompat来构造
  49. builder.setSmallIcon(R.mipmap.icon_login_logo).setLargeIcon(BitmapFactory.decodeResource(getResources(),R.mipmap.icon_login_logo)).setContentTitle(title);
  50. if (progress > 0 && progress < 100) {
  51. //下载进行中
  52. builder.setProgress(100,progress,false);
  53. } else {
  54. builder.setProgress(0,false);
  55. }
  56. builder.setAutoCancel(true);
  57. builder.setWhen(System.currentTimeMillis());
  58. builder.setContentText(content);
  59. if (progress >= 100) {
  60. //下载完成
  61. builder.setContentIntent(getInstallIntent());
  62. }
  63. mNotification = builder.build();
  64. mnotificationmanager.notify(0,mNotification);
  65. }
  66. /**
  67. * 安装apk文件
  68. *
  69. * @return
  70. */
  71. private PendingIntent getInstallIntent() {
  72. File file = new File(StorageUtil.DOWNLOAD_DIR + "APP文件名");
  73. Intent intent = new Intent(Intent.ACTION_VIEW);
  74. intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
  75. intent.setDataAndType(Uri.parse("file://" + file.getAbsolutePath()),"application/vnd.android.package-archive");
  76. PendingIntent pendingIntent = PendingIntent.getActivity(this,intent,PendingIntent.FLAG_UPDATE_CURRENT);
  77. return pendingIntent;
  78. }
  79. /**
  80. * 下载apk文件
  81. *
  82. * @param url
  83. */
  84. private void downloadFile(String url) {
  85. OkHttpUtils.get().url(url).build().execute(new FileCallBack(StorageUtil.DOWNLOAD_DIR,"APP文件名") {
  86. @Override
  87. public void onError(Call call,Exception e,int id) {
  88. notifyMsg("温馨提醒",0);
  89. stopSelf();
  90. }
  91. @Override
  92. public void onResponse(File response,int id) {
  93. //当文件下载完成后回调
  94. notifyMsg("温馨提醒","文件下载已完成",100);
  95. stopSelf();
  96. }
  97. @Override
  98. public void inProgress(float progress,long total,int id) {
  99. //progress*100为当前文件下载进度,total为文件大小
  100. if ((int) (progress * 100) % 10 == 0) {
  101. //避免频繁刷新View,这里设置每下载10%提醒更新一次进度
  102. notifyMsg("温馨提醒","文件正在下载..",(int) (progress * 100));
  103. }
  104. }
  105. });
  106. }
  107. }

然后我们只需要在我们想要的更新APP的时候去调起这个服务即可,比如在系统设置里的"版本检查"等

  1. Intent intent = new Intent(mContext,DownloadService.class);
  2. intent.putExtra("apkUrl","APK下载地址");
  3. startService(intent);

总结

这里我只是粗略演示本地自动更新APP的功能,在实际应用中,我们应该配合服务端来做,比如在用户启动APP的时候去比对版本号,如果版本号低于服务器的版本号,那么此时服务端应该给客户端一个透传推送,这里的推送内容应该为新版本APP的下载地址,此时就可以根据该地址来下载新版APP了,当遇到重大更新,不再对老版本进行兼容的时候,可以强制用户升级,这里的方案有很多,比如调用系统级对话框,让用户没办法取消等操作,这里就不做更多描述。以上就是这篇文章的全部内容,希望对有需要的人能有所帮助。

andriod app更新的更多相关文章

  1. IOS开始对App Store大扫除:你的APP更新了吗?

    成都亿合科技小编从北京商报了解到,对于开发APP应用的要注意啦,IOS要开始对App Store大扫除:你的APP更新了吗? 日前苹果App Store的开发者们发送邮件,表示将实施一个持续评估应用行 ...

  2. App更新之dialog数字进度条

    App更新之dialog数字进度条 前言:现在一般的Android软件都是需要不断更新的,当你打开某个app的时候,如果有新的版本,它会提示你有新版本需要更新.当有更新时,会弹出一个提示框,点击下载, ...

  3. App更新(Android)

     App更新(Android) 前言:现在一般的Android软件都是需要不断更新的,当你打开某个app的时候,如果有新的版本,它会提示你有新版本需要更新.该项目实现的就是这个功能.并且有强制更新和更 ...

  4. 从国内APP更新“精雕细琢” 看国内外产品理念之差

    看国内外产品理念之差" title="从国内APP更新"精雕细琢" 看国内外产品理念之差"> 对于当下的大众来说,智能手机已经成为新的" ...

  5. uniapp中IOS安卓热更新和整包更新app更新

    在App.vue中 onLaunch: function() { console.log('App Launch'); // #ifdef APP-PLUS this.getVersion(); // ...

  6. 远程通知中app更新提示。

    // // AppDelegate.m // SDJK // // Created by Jobs on 6/13/16. // Copyright (c) 2016 com.FlintInfo.dE ...

  7. [课堂实践与项目]NavigationController与TabBarController的综合使用及易错点分析(包含消息提醒,app更新)

    陈述:我们在使用tabbarController的时候,我们总会和NavagationController联合起来.但是不联合的时候又是什么样的一种pool的情况呢?我们就单单的 TabBarCont ...

  8. 社交系统ThinkSNS+ APP更新至V0.8.3---新增打赏、用户认证

    一.ThinkSNS简介 目前社交系统ThinkSNS(简称TS)有两个版本并行: ThinkSNS V4----最新版本ThinkSNS V4.6.1,第一次发布时间为2015年7月15日,最近更新 ...

  9. 社群系统ThinkSNS V4.5.29 APP更新发布,新增用户认证及系统消息

    社群系统ThinkSNS V4版本移动端APP将于7月29日更新发布,本次更新修复部分bug,最主要是增加了移动端APP的用户认证功能,以及添加了系统消息,为V4.5.29版本发布.这两个功能PC端的 ...

  10. 分享:苹果APP更新上架被拒的另一种理由(Safety - Objectionable Content)

    这两个星期,本来想和大伙分享:写IT连创业系列运营篇. 但时间飞过,仍只是写了开头,一直很忙,没能完往下写. 今天就动手写点其它内容,哈哈,免的和小伙伴太陌生〜〜〜 前几天更新了:IT恋和IT连的版本 ...

随机推荐

  1. springcloud04 Ribbbon

    Ribbbon虽然现在已经进入维护模式了,但是使用的还是很多的. 1.官网 https://github.com/Netflix/ribbon/wiki/Getting-Started 2.Ribbo ...

  2. element ui el-date-picker 禁止选择指定日期

    1.日期选择器组件代码 <el-col :span="20"> <el-form-item label="活动起始日期值" prop=&quo ...

  3. 非线性优化-NLopt

    通过 对 一个 数学 模型 的求解 来介绍 NLopt的使用方法 数学模型: 这个是目标函数 求满足 条件的情况下 x2的开平方最小 边界约束 非线性不等式约束如下 有两个参数 x1 和 x2 ,其中 ...

  4. python requests 最牛攻略

    目录 安装 Reuqests HTTP 简介 什么是 HTTP HTTP工作原理 HTTP的9种请求方法 HTTP状态码 requests 快速上手 requests 发起请求的步骤 requests ...

  5. Spring Boot自动配置原理懂后轻松写一个自己的starter

    目前很多Spring项目的开发都会直接用到Spring Boot.因为Spring原生开发需要加太多的配置,而使用Spring Boot开发很容易上手,只需遵循Spring Boot开发的约定就行了, ...

  6. 【Oculus Interaction SDK】(十二)Meta Quest 如何开启透视(Passthrough)

    前言 前段时间 Oculus 的 SDK 频繁更新,很多已有的教程都不再适用于现在的版本了.本系列文章的主要目的是记录现版本常见功能的实现方法,便于自己后续开发.当然,不排除我文章刚写完 SDK 又变 ...

  7. Cesium计算多边形面积(十一)

    //计算三角形面积 function triangleArea(p0, p1, p2) { let v0 = Cesium.Cartesian3.subtract(p0, p1, new Cesium ...

  8. NOIP2022 总结

    \(\text{summary}\) 怎么都没想到这次题目那么有新意:把这样的题 \(T2\) 放 \(T2\)...... 策略出现很大问题,赛后也意识到很多选手也会出现同样的问题:死磕 \(T2\ ...

  9. Vladik and fractions

    题目大意 给出 \(n\),求一组 \(x,y,z\) 满足 \(\frac 1x + \frac 1y + \frac 1z = \frac 2n\) 若不存在合法的解,输出 \(-1\) 其中 \ ...

  10. vue中所有的封装方式总结

    如何确定我需要封装呢? 1.复用,如果觉得以后还会用到 2.你觉得方便,别的地方可能也需要用 3.如果不封装,页面代码臃肿的时候 1.封装API 使用场景:业务中最常见最普通的封装 详细在这篇:htt ...