前言:
我们似乎在做什么apk,都需要去做更新这个功能,那怎么去做这个功能才好呢,那当然在做的时候当然回去百度一下(除非是大神)。想我这个种没做一个比较好玩的功能的时候,第一步就是去百度大家的做法,想法。怎么去实现、怎么完成。怎样比较好看,和健壮性比较好。
一直一来自己都是小白,所以很明白小白的心情,自己写博客也会写的非常详细,希望大神勿喷。也希望小白能从中得到学习。
好了不啰嗦,马上开始我们的代码体验.
为了不浪费大家的时间,我们先开看一下我们的实现效果先.如果这个效果是你想要的.就可以仔细阅读一下本篇文章啦.
正文:
这个自动检测升级Apk的功能,相信每个应用都会使用到。这里也提供给大家使用,直接copy过去就能使用了。
不需要做过多的调整。
其中使用Service、BroadcastReceiver、OkHttp下载、Gson解析json、NotificationManager、Notification 运用的知识也挺多的,也可以供大家参考、学习使用。
源码下载:点击打开链接
注意:博主使用的是Tomcat服务器,我们将这些数据下载下来放在Tomcat服务上就可以测试了
好了接下在直接进入代码主题:
1、第一步先添加入所需要的第三方依赖
2、模拟写好要去读取的json数据(这里可以是xml数据,根据自己喜欢)
update.json
{
//app名字
appname:"UpdateApk",
//服务器版本号
serverVersion:2,
//是否强制更新 true为强制升级,false为正常状态
whetherForce:false,
//apk下载地址
updateurl:"http://127.0.0.1:8080/UpdateApk.apk",
//版本的更新的描述
upgradeinfo:"有新功能哦!要不要尝试一下"
}
3、写好对应的Bean类
UpdateInfo.java
public class UpdateInfo {
//app名字
private String appname;
//服务器版本
private int serverVersion;
//强制升级
private boolean whetherForce;
//app最新版本地址
private String updateurl;
//升级信息
private String upgradeinfo;
/**
* 都生成对于的set and get 方法
* 这里我就不把set and get 方法贴出来了,读者注意去生成就好了
*/
}
4、单独创建一个java类来存储存放json数据的连接(方便管理)
HttpApi.java
/**
* 这里存放我们要去读取的json数据连接
*/
public class HttpApi {
public static String updateUrl = "http://127.0.0.1:8080/updateapk.json";
}
5、创建MyApplication.java 去继承 Application。需要一进去APP就去请求网络进行APP版本信息比配
/**
* 在程序进入的时候我们就去读取网络上APK的信息
* Created by WL-鬼 on 2017/5/13.
*/
public class MyApplication extends Application {
//先在这创建好上下文环境,可能会使用到,这里为个人习惯,需要使用的时候在创建也是可以的
private static Context mContext;
//读取到的bean对象
private static UpdateInfo mUpdateInfo;
public static final String UPDATE_ACTION = "UPDATE_INFO";
@Override
public void onCreate() {
super.onCreate();
mContext = this.getApplicationContext();
getServiceUpdateInfo(false);
}
/**
* 获取服务器上的更新信息
* @param isClick 参数一:是否为手动点击的检测更新
* @return 获取到的UpdateInfo对象
*/
public static UpdateInfo getServiceUpdateInfo(final boolean isClick){
mUpdateInfo = new UpdateInfo();
new Runnable() {
@Override
public void run() {
OkHttpClient mOkHttpClient = new OkHttpClient();
Request mRequest = new Request.Builder().url(HttpApi.updateUrl).build();
Call mCall = mOkHttpClient.newCall(mRequest);
Callback callback = new Callback() {
@Override
public void onFailure(Call call, IOException e) {
String r = e.toString();
Log.d("onFailure",r);
}
@Override
public void onResponse(Call call, Response response) {
Log.d("MyApplication--onResponse",response.code()+"");
try {
//只有服务器已成功处理了请求,才继续处理我们接下来想处理的事情
if (response.code() == 200){
String infoStr = response.body().string();
Log.d("onResponse",infoStr);
Gson mGson = new Gson();
mUpdateInfo = mGson.fromJson(infoStr,UpdateInfo.class);
//创建Intent
Intent intent = new Intent(UPDATE_ACTION);
if (isClick){
intent.putExtra("isclick",isClick);
}
//开启广播
mContext.sendBroadcast(intent);
}
} catch (IOException e) {
e.printStackTrace();
}
}
};
mCall.enqueue(callback);
}
}.run();
return mUpdateInfo;
}
public static UpdateInfo getmUpdateInfo() {
return mUpdateInfo;
}
public static Context getContext() {
return mContext;
}
}
6、去创建 UpdateReceiver 继承 BroadcastReceiver 并且需要注册(这里可以使用动态注册和静态注册)(我这里实现了静态注册)
6.1、在UpdateReceiver中所需要使用到的布局文件
download_promp.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:padding="8dp"
android:id="@+id/download_notification_root"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/download_promp_icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<LinearLayout
android:orientation="vertical"
android:layout_marginLeft="10dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<TextView
android:id="@+id/download_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/download_promp_info"
android:paddingTop="8dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
</LinearLayout>
6.2,这里插入写的一个工具类
MyUtils.java
public class MyUtils {
//放在下载更新包的文件夹
public static String update