AndroidAPP更新下载,实现Notification通知栏进度通知,下
载完成后点击安装
简单做⼀个APP检测更新的⼩⼯具,有点粗糙。不能断点续传,只⽤为个⼈觉得没有必要,⾃⼰可根据⼤家的想法添加更多的功能,这⾥只是为了想我⼀样的初学者和⽐较简约的⼈所提供。
效果如下:
基本思路先理⼀理,以我的实际开发为例:⾸先当然要⼀个⽹络去请求我们的服务器,获得仓库中的apk版本信息和下载路径,在和⾃⼰当前的版本号进⾏⽐较,当⾃⼰的版本号⼩于仓库中的版本号,就提⽰⽤户下载,在根据更新等级进⾏下载强度操作(是否强制下载还是什么的)。在下的时候监听⽂件下载的Progress 来更新 notification中的进度条和进度信息等待,当下载完成后,可让⽤户点击(关闭通知就⾏)进⼊到安装apk界⾯,这样就算完成了。
本次使⽤了okhttp (okgo)⽹络框架进⾏下载⽂件,这⾥确定下载的是apk就不多过滤信息了,直接下载安装。
⾸先想到的是要⽤⼀个单例来做下载管理,我们需要传⼊⼀个context 。
Context context;
private static final AppUpdateService INSTANCE = new AppUpdateService();
private static class LazyHolder {
public static AppUpdateService getThis(Context context) {
return INSTANCE;
}
}
public static AppUpdateService getInstance(Context context) {
This(context);
}
初始化Notification 、notificationCompat.Builder和notificationManager
//初始化通知
private void initNotification() {
notificationManager = (NotificationManager) Instance().getSystemService(Context.NOTIFICATION_SERVICE);
builder = new NotificationCompat.Instance());
builder.setContentTitle("正在更新...") //设置通知标题
.setSmallIcon(R.mipmap.ic_launcher_round)
.setLargeIcon(BitmapFactory.Instance().getResources(), R.mipmap.ic_launcher_round)) //设置通知的⼤图标                .setDefaults(Notification.DEFAULT_LIGHTS) //设置通知的提醒⽅式:呼吸灯
.setPriority(NotificationCompat.PRIORITY_MAX) //设置通知的优先级:最⼤
.setAutoCancel(false)//设置通知被点击⼀次是否⾃动取消
.setContentText("下载进度:" + "0%")
.setProgress(100, 0, false);
notification = builder.build();//构建通知对象
}
下载更新通知核⼼代码,可更新直接的选择是否让⽤户点击后安装,还是直接安装。
public void download(String url, String filePath) {
@Override
public void onSuccess(Response<File> response) {
google官方下载appFile file = response.body();
Log.e("update", "onSuccess: 下载完成" + Path() + Name());
builder.setContentTitle("下载完成")
.setContentText("点击安装")
.setAutoCancel(true);//设置通知被点击⼀次是否⾃动取消
//点击安装代码块
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setDataAndType(Uri.parse("file://" + String()), "application/vnd.android.package-archive");                PendingIntent pi = Activity(context, 0, intent, 0);
notification = builder.setContentIntent(pi).build();
//⾃动安装
//              installApk(file);
}
//下载进度
@Override
public void downloadProgress(Progress progress) {
super.downloadProgress(progress);
Log.e("update", "downloadProgress: " + progress.fraction);
builder.setProgress(100, (int) (progress.fraction * 100), false);
builder.setContentText("下载进度:" + (int) (progress.fraction * 100) + "%");
notification = builder.build();
}
@Override
public void onStart(Request<File, ? extends Request> request) {
initNotification();
}
@Override
public void onError(Response<File> response) {
Toast.makeText(context, "下载错误", Toast.LENGTH_SHORT).show();
}
});
}
安装apk
private void installApk(File file) {
//新下载apk⽂件存储地址
File apkFile = file;
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setDataAndType(Uri.parse("file://" + String()), "application/vnd.android.package-archive");        context.startActivity(intent);
notificationManager.cancel(1);//取消通知
}
获取本地版本号
public  int getVersionCode() {
PackageManager packageManager = PackageManager();
int versionCode = 0;
try {
PackageInfo packageInfo = PackageName(), 0);            versionCode = packageInfo.versionCode;
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
return versionCode;
}
获取更新信息,⾃⼰根据⾃⼰的⽹络框架修改。
public void getUpdate() {
@Override
public void onSuccess(Response<String> response) {
ApkSer apkSer = new ApkSer();
apkSer = new Gson().fromJson(response.body(), ApkSer.class);
CustomDialog("有新版本需要更新", 3, UpdatePath());
}
});
}
提⽰框信息提⽰⽤户。
public void CustomDialog(final String cominit, int updatelv, final String url) {
CustomDialog.Builder dialog = new CustomDialog.Builder(context);
dialog.setTitle("版本更新")
.setMessage(cominit);
dialog.setCancelable(false);
//更新等级 0:普通 1:重点bug修复更新  2:新功能更新 3:配置更新 4:特殊更新,强制⽤户更新
if (updatelv == 0 || updatelv == 2) {
dialog.setCancelBtn("下次提醒", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int i) {
dialog.dismiss();
}
});
} else {
dialog.setCanceledOnTouchOutside(false);
}
dialog.setCancelBtn("重点更新", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int i) {
Toast.makeText(context,"已添加到下载任务",Toast.LENGTH_SHORT).show();
dialog.dismiss();
download(url, "path");
}
});
}
版本信息对象字段
public class ApkSer {
public String type;            //更新内容类型,apk安装包  res资源
public String apkName;
public String packageName;        //apk包名
public Long versionCode;    //库版本号
public String versionName;    //库版本名称
public int important;          //更新等级 0:普通 1:重点bug修复更新  2:新功能更新 3:配置更新 4:特殊更新,强制⽤户更新public String commit;          //更新内容
public String updatePath;      //更新下载地址
public String updateTime;        //更新时间
}
完整代码如下,欢迎⼤家点评。
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
t.Context;
t.DialogInterface;
t.Intent;
t.pm.PackageInfo;
t.pm.PackageManager;
aphics.BitmapFactory;
import android.Uri;
import android.support.v4.app.NotificationCompat;
import android.util.Log;
import android.widget.Toast;
le.gson.Gson;
import com.hx.view.widget.CustomDialog;
import com.lzy.okgo.callback.FileCallback;
import com.lzy.okgo.callback.StringCallback;
import com.del.Progress;
import com.del.Response;
import com.quest.base.Request;
import com.fig.AppConfig;
import com.yhx.loan.R;
import com.yhx.loan.base.MyApplication;
import java.io.File;
public class AppUpdateService {
private NotificationManager notificationManager;
private Notification notification; //下载通知进度提⽰
private NotificationCompat.Builder builder;
private boolean flag = false; //进度框消失标⽰之后发送通知
public static boolean isUpdate = false; //是否正在更新
Context context;
private static final AppUpdateService INSTANCE = new AppUpdateService();
private static class LazyHolder {
public static AppUpdateService getThis(Context context) {
return INSTANCE;
}
}
public static AppUpdateService getInstance(Context context) {
This(context);
}
private AppUpdateService() {

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。