/**
* 闪屏页完成并且检查是否有新版本选择下载安装
*/
public class SplashActivity extends AppCompatActivity {
private RelativeLayout rl_root;
private TextView tvVersion;
// 状态码
protected static final int CODE_UPDATE_DIALOG = 0;
protected static final int CODE_ENTER_HOME = 1;
// 返回服务器的信息
private String mVersionName; // 服务器的版本名
private int mVersionCode; // 服务器的版本号
private String mDesc; // 描述信息
private String mDowloadUrl; // 下载地址
private TextView tvProgress;
private Handler mHandler = new Handler() {
public void handleMessage(android.os.Message msg) {
switch (msg.what) {
case 0:
showUpdateDialog();
break;
case 1:
enterHome();
break;
default:
break;
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_splash);
x.Ext.init(getApplication());
initView();
initData();
}
private void initView() {
tvVersion = (TextView) findViewById(R.id.tv_code);
rl_root = (RelativeLayout) findViewById(R.id.rl_root);
tvProgress = (TextView) findViewById(R.id.tv_progress);
}
private void initData() {
tvVersion.setText("版本:" + getVersionName());
checkVersion();
//渐变动画
AlphaAnimation alphaAnimation = new AlphaAnimation(0.6f, 1);
alphaAnimation.setDuration(3000);
alphaAnimation.setFillAfter(true);
rl_root.startAnimation(alphaAnimation);
//对动画设置监听,动画播放结束后跳转到新手引导页
alphaAnimation.setAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
}
@Override
public void onAnimationEnd(Animation animation) {
enterGuide();
}
@Override
public void onAnimationRepeat(Animation animation) {
}
});
}
/**
* 获取本地应用的版本名和版本号
* 版本名:显示在应用的flash页面上,让用户看的
* 版本号:应用的内部标识,用户不需知道,用于判断是否有新版本
*/
private String getVersionName() {
PackageManager packageManager = getPackageManager();
try {
PackageInfo packageInfo = packageManager.getPackageInfo(getPackageName(), 0);
String versionName = packageInfo.versionName;
int versionCode = packageInfo.versionCode;
return versionName;
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
return null;
}
/**
* 获取本地应用的版本号,用于判断是否版本更新
* @return
*/
private int getVersionCode() {
PackageManager packageManager = getPackageManager();
try {
PackageInfo packageInfo = packageManager.getPackageInfo(getPackageName(), 0);
int versionCode = packageInfo.versionCode;
return versionCode;
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
return -1;
}
/**
* 从服务器获取版本信息进行校验 ,
* 若版本名大于当前版本名,则提示用户更新
*/
public void checkVersion() {
new Thread() {
@Override
public void run() {
Message msg = Message.obtain();
HttpURLConnection conn = null;
try {
URL url = new URL("http://10.0.2.2:8080/update.json");
conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.setConnectTimeout(5000);
conn.setReadTimeout(5000);
conn.connect();
int responseCode = conn.getResponseCode();
if (responseCode == 200) {
// 若请求成功,则接收服务器返回的输入流,并调用流工具把输入流转换为String类型
InputStream inputStream = conn.getInputStream();
String result = StreamUtils.readFromStream(inputStream);
Log.e("服务器返回的结果:" , result);
// 解析服务器返回的数据
JSONObject jsonObject = new JSONObject(result);
mVersionName = jsonObject.getString("versionName");
mVersionCode = jsonObject.getInt("versionCode");
mDesc = jsonObject.getString("description");
mDowloadUrl = jsonObject.getString("downloadUrl");
Log.e("mVersionCode",mVersionCode+"");
// 通过比较本地应用的版本号和服务器中的版本号,来判断是否有新版本升级
if (mVersionCode > getVersionCode()) {
// 有升级,则弹出升级对话框(耗时操作需在handler中进行)
msg.what = CODE_UPDATE_DIALOG;
}else{
// 没有版本升级
msg.what = CODE_ENTER_HOME;
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}.start();
}
/**
* 升级对话框
*/
protected void showUpdateDialog() {
//1,实例化Builder
AlertDialog.Builder builder = new AlertDialog.Builder(this);
//2,设置Builder的属性
builder.setTitle("最新版本:" + mVersionName);
builder.setMessage(mDesc);
builder.setPositiveButton("立即更新", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
download();
}
});
builder.setNegativeButton("以后再说", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
enterHome();
}
});
//设置返回监听,用户点击返回键时触发
builder.setOnCancelListener(new DialogInterface.OnCancelListener() {
@Override
public void onCancel(DialogInterface dialog) {
enterHome();
}
});
builder.show();
}
/**
* 下载新版本的apk文件
* 使用xUtils3框架
*/
protected void download(){
tvProgress.setVisibility(View.VISIBLE);
//下载的文件保存的路径
String target = Environment.getExternalStorageDirectory()+"/myapp/";
RequestParams params = new RequestParams(mDowloadUrl);
params.setSaveFilePath(target);
params.setAutoRename(true); //自动命名
x.http().post(params, new Callback.CommonCallback<File>() {
@Override
public void onSuccess(File result) {
//下载成功后,要跳转到系统安装页面
Intent intent = new Intent(Intent.ACTION_VIEW);
//设置intent的属性
intent.addCategory(intent.CATEGORY_DEFAULT);
intent.setDataAndType(Uri.fromFile(result), "application/vnd.android.package-archive");
startActivity(intent);
}
@Override
public void onError(Throwable ex, boolean isOnCallback) {
Toast.makeText(getApplicationContext(),"下载失败",Toast.LENGTH_SHORT).show();
enterHome();
}
@Override
public void onCancelled(CancelledException cex) {
enterHome();
}
@Override
public void onFinished() {
enterHome();
}
// TODO: 2016/12/15 下载进度
});
}
/**
* 进入引导页
*/
private void enterGuide(){
Intent intent = new Intent(this,GuidePageActivity.class);
startActivity(intent);
finish();
}
/**
* 进入主页面
*/
private void enterHome(){
Intent intent = new Intent(this,MainActivity.class);
startActivity(intent);
finish();
}
}
普通的APK安装更新
最新推荐文章于 2024-04-28 08:15:00 发布