延迟展示对话框 (重点)
private void initView() {
....
//r:消息的执行操作
//delayMillis : 延迟时间,但是毫秒值
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
//提醒用户更新版本
update();
}
}, 2000);//延迟多少时间给handler发送消息
//delayMillis : 延迟时间,单位毫秒值
/*new Handler(){
public void handleMessage(android.os.Message msg) {
//提醒用户更新版本
update();
};
}.sendEmptyMessageDelayed(0, 2000);*///延迟多长时间给handler发送消息
}
自己学习和总结的关于app的升级和安装
就是我们在splash页面(自己随意)先获取自己的版本VersionCode我们在获取服务端的一个json,获取里面的serverVersionCode,比较这两个值,ServerVersionCode > versionCode 进行弹出对话框提示跟新,否则继续执行动画.点击下次在说继续执行动画,点击现在下载,进行下载,之后下载安转. 下载使用的是系统的DownloadManager,下载完成后发送广播,我们需要先注册一个广播
关于VersionCode和VersionName的区别
首先就引用一下子:
Google为APK定义了两个关于版本属性:VersionCode和VersionName,他们有不同的用途。
VersionCode:对消费者不可见,仅用于应用市场、程序内部识别版本,判断新旧等用途。
VersionName:展示给消费者,消费者会通过它认知自己安装的版本
ok自己总结一下:
第一点就是: versioncode是用于版本更新和应用市场来判断是否提醒用户进行安装的一个标识. 而versionName是我们在安转软件的时候展示给用户观看的自己的安装的版本.
第二点是: verSionCode比较正式,而VersionName就比较随意了,可以随意的取名称.
获取app的versionCode和versionName
直接上源码:
public class PackageUtils {
public static String getVersionName(Context mContext){
// 获取package管理者 需要上下文
PackageManager packageManager = mContext.getPackageManager();
//参数说明 参数一是获取哪一个包名的package的信息 (application包括了activity所以也会包括activity的信息)
//参数二的信息就是设置是不是之后去
//获取包名的方法
String packageName = mContext.getPackageName();
try {
PackageInfo packageInfo = packageManager.getPackageInfo(packageName, 0);
//获取里面的信息
String versionName = packageInfo.versionName;
return versionName;
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
// 获取里面的信息
// applicationInfo.
return null;
}
// 获取版本信息
public static int getVersionCode(Context mContext){
// 获取package管理者 需要上下文
PackageManager packageManager = mContext.getPackageManager();
//参数说明 参数一是获取哪一个包名的package的信息 (application包括了activity所以也会包括activity的信息)
//参数二的信息就是设置是不是获取其他的权限还是获取广播,设置为0只是获取简单的版本名称和版本信息
//获取包名的方法
String packageName = mContext.getPackageName();
try {
PackageInfo packageInfo = packageManager.getPackageInfo(packageName, 0);
//获取里面的信息
int versionCode = packageInfo.versionCode;
return versionCode;
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
return -1;
}
}
服务端的获取的信息
我访问服务端去获取服务端上app的VersionCode:
获取的json的展示:
{
"data": {
"ServerVersionCode": "2",
"ServerVersionName": "1.0.2",
"appname": "fabei.apk",
"updateurl": "http://IP地址/apk/fabei.apk",
"upgradeinfo": "V1.0.2版本更新,你想不想要试一下哈!!!"
},
"code": "200",
"code_msg": "获取成功"
}
我们可以看到下载地址.
关于Retrofit的集成
注意gradle中的添加的依赖:
//网络请求框架
compile 'com.squareup.retrofit2:retrofit:2.3.0'
compile 'com.squareup.retrofit2:converter-scalars:2.3.0'
compile 'com.squareup.retrofit2:converter-gson:2.3.0'
compile 'com.squareup.retrofit2:adapter-rxjava2:2.3.0'
//RxJava框架
compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
compile 'io.reactivex.rxjava2:rxjava:2.1.5'
//运行时权限
compile 'com.tbruyelle.rxpermissions2:rxpermissions:0.9.1@aar' // 后面说到这个库
使用一个管理类:
public class RetrofitManager {
private static RetrofitManager mRetrofitManager;
private static Retrofit mRetrofit;
private static Retrofit mDRetrofit;
private RetrofitManager() {
}
/**
* 创建网络请求
*
* @param reqServer 网络接口
* @param <T> 泛型
* @return 返回网络接口对应的请求类
*/
private <T> T createReq(Class<T> reqServer) {
return mRetrofit.create(reqServer);
}
/**
* 获取服务器网络请求接口对应的类
*
* @return 服务器网络请求接口对应的类
*/
public ServerApi getServer() {
return createReq(ServerApi.class);
}
/**
* 返回线程安全的单例
*
* @return RetrofitManager单例
*/
public static synchronized RetrofitManager getInstance() {
if (mRetrofitManager == null) {
mRetrofitManager = new RetrofitManager();
}
return mRetrofitManager;
}
//在自定义Application中初始化
public static void init() {
OkHttpClient.Builder builder = new OkHttpClient.Builder();
builder.connectTimeout(50, TimeUnit.SECONDS);
builder.readTimeout(50, TimeUnit.SECONDS);
builder.writeTimeout(50, TimeUnit.SECONDS);
builder.retryOnConnectionFailure(true);
OkHttpClient client = builder.build();
mRetrofit = new Retrofit.Builder()
.baseUrl(UrlConstant.BASE_URL)
.addConverterFactory(ScalarsConverterFactory.create())
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create()) //通过RxJavaCallAdapterFactory为Retrofit添加RxJava支持:
.client(client)
.build();
}
}
贴一个ServerApi.class 的接口类:
public interface ServerApi {
//其他的代码
/**
* 获取跟新app服务器信息
* @return
*/
@GET("apk/upgrade.json