关于android程序自动更新功能的实现,如何去除安装提示

关于android程序自动更新功能的实现,如何去除安装提示,第1张

造成 Android开机就显示升级应用的错误,是自己刷机后没有wipe,双清。或手机在线ota升级后没有自动双清,导致系统缓存混乱,所以报错,建议执行wipe(双清) *** 作。

wipe会删除手机所有设置和所有已安装程序及相关文件,恢复到出厂设置,就是刚拿到手机的原始状态。

双wipe步骤如下:

1.关机 按HOME键+电源键进入recovery模式。

2.用音量下键选择wipe data/factory reset这项。

3.按HOME键执行wipe data/factory reset命令后再用音量下键选择Yes -- delete all user data并按HOME键执行命令。

4.执行Yes -- delete all user data命令后,表示开始执行。

5.按音量下键选择wipe cache partition命令并按HOME键执行。

6.执行wipe cache partition命令后,音量下键选择Yes -- Wipe Cache并按HOME键执行命令。

7.执行Yes -- Wipe Cache命令后,表示wipe cache partition也执行成功了。

wipe data/factory reset和wipe cache partition执行成功后 选择 reboot system now 重启系统即可。

*** 作步骤:手机打开gprs,开启电子市场程序(google自带的那个),点击“我的应用程序“-“全部更新”-找到google地图,点开,将“允许自动更新”里的勾去掉就行了。如果想禁止全部程序的自动更新可以在电子市场的“设置”-“通知”栏选择“不通知我”。

Android开发如何实现APP自动更新                             

     

先来看看要实现的效果图:

对于安卓用户来说,手机应用市场说满天飞可是一点都不夸张,比如小米,魅族,百度,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的下载

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.net.Uri  

import android.os.IBinder  

import android.support.annotation.Nullable  

import android.support.v7.app.NotificationCompat  

   

import com.fangku.commonlibrary.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.com 

 */  

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的时候去调起这个服务即可,比如在系统设置里的"版本检查"等

Intent intent = new Intent(mContext, DownloadService.class)  

intent.putExtra("apkUrl", "APK下载地址")  

startService(intent)

总结

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


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/11122068.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-13
下一篇2023-05-13

发表评论

登录后才能评论

评论列表(0条)

    保存