package zz.itcast.mobilesafez20.activity;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import org.json.JSONException;
import org.json.JSONObject;
import com.lidroid.xutils.HttpUtils;
import com.lidroid.xutils.exception.HttpException;
import com.lidroid.xutils.http.ResponseInfo;
import com.lidroid.xutils.http.callback.RequestCallBack;
import zz.itcast.mobilesafez20.R;
import zz.itcast.mobilesafez20.app.MobilesafeApplication;
import zz.itcast.mobilesafez20.utils.AppUtils;
import zz.itcast.mobilesafez20.utils.MyConstant;
import zz.itcast.mobilesafez20.utils.StreamTools;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.content.DialogInterface.OnCancelListener;
import android.content.DialogInterface.OnDismissListener;
import android.content.Intent;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.content.res.AssetManager;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.BitmapFactory.Options;
import android.net.Uri;
import android.os.Bundle;
import android.os.SystemClock;
import android.widget.TextView;
public class SplashActivity extends BaseActivtiy {
// 用于安装
protected static final int REQUEST_FOR_INSTALL = 1;
private int versionCode;
private String versionName;
private ProgressDialog pd;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
System.out.println("SplashActivity onCreate");
/*
* SplashActivity 闪屏界面 1.显示一个logo 广告 2-3秒消失 2.比如数据的初始化,或者表的创建等等
* 3.检测版本更新,去服务器检测一下是否有最新版本 如果有新版本弹对话框提示用户更新
*/
getVersionInfo();
// 这里自动更新 开发期间肯定是true 这里为了方便写成false
boolean isUpdate = sp.getBoolean(MyConstant.KEY_AUTO_UPDATE, false);
if (isUpdate) {
// 直接去检查版本更新 服务器 联网
checkUpdate();
} else {
// 不更新
new Thread() {
public void run() {
SystemClock.sleep(1500);
gotoHomePageActivity();
}
}.start();
}
}
private void checkUpdate() {
final String path = getString(R.string.update_url);
new Thread() {
public void run() {
try {
// 联网前睡一会
SystemClock.sleep(1500);
URL url = new URL(path);
HttpURLConnection conn = (HttpURLConnection) url
.openConnection();
conn.setRequestMethod("GET");
conn.setConnectTimeout(5000);
int code = conn.getResponseCode();
if (code == 200) {
// 联网成功
InputStream inputStream = conn.getInputStream();
// 将流转换成字符串
String jsonStr = StreamTools
.getStringFromStream(inputStream);
// 解析JSON
JSONObject jsonObj = new JSONObject(jsonStr);
// 通过键值对解析
int newCode = jsonObj.getInt("code");
String info = jsonObj.getString("info");
String apkUrl = jsonObj.getString("apkUrl");
System.out.println("新本号:" + newCode + ",新版本信息:" + info
+ ",apkurl:" + apkUrl);
// 获取到服务器版本之后 应该和本地版本做比对
if (newCode == versionCode) {
// 说明当前已经是最新版本
gotoHomePageActivity();
} else {
// 说明有新版本 弹出提示框
showUpdateDialog(info, apkUrl);
}
} else {
// 没联网成功
AppUtils.showToast("服务器忙,请稍候重试", SplashActivity.this);
gotoHomePageActivity();
}
} catch (MalformedURLException e) {
e.printStackTrace();
// 弹一个吐司 服务器忙
AppUtils.showToast("服务器忙,请稍候重试", act);
// 直接进入首页
gotoHomePageActivity();
} catch (IOException e) {
AppUtils.showToast("请检查网络设置或稍候重试", act);
// 直接进入到首页
gotoHomePageActivity();
e.printStackTrace();
} catch (JSONException e) {
AppUtils.showToast("服务器忙,请稍候重试", act);
gotoHomePageActivity();
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
gotoHomePageActivity();
AppUtils.showToast("服务器忙,请稍候重试", act);
}
}
}.start();
}
private void showUpdateDialog(String info, final String apkUrl) {
final AlertDialog.Builder builder = new Builder(this);
builder.setTitle("升级提示");
// 显示新版本的特性
builder.setMessage(info);
// 取消和确定
builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
gotoHomePageActivity();
}
});
builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// 去下载 下载的地址
downloadApk(apkUrl);
}
});
// 强制用户无法消除对话框
// builder.setCancelable(false);
// 给对话框设置一个消失的监听
builder.setOnCancelListener(new OnCancelListener() {
@Override
public void onCancel(DialogInterface dialog) {
gotoHomePageActivity();
}
});
runOnUiThread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
builder.show();
}
});
}
private void downloadApk(String apkUrl) {
public static final String ROOT_PATH = Environment
new RequestCallBack<File>() {
// 当开始下载
@Override
public void onStart() {
// TODO Auto-generated method stub
super.onStart();
pd = new ProgressDialog(SplashActivity.this);
pd.setMessage("下载中...");
// 设置为水平进度样式
pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
pd.show();
}
// 是HttpUtils框架自带的方法 设置最大进度和当前进度
@Override
public void onLoading(long total, long current,
boolean isUploading) {
// TODO Auto-generated method stub
super.onLoading(total, current, isUploading);
if (pd != null) {
pd.setMax((int) total);
pd.setProgress((int) current);
}
}
@Override
public void onSuccess(ResponseInfo<File> responseInfo) {
// TODO Auto-generated method stub
AppUtils.showToast("下载成功", SplashActivity.this);
if (pd != null) {
pd.dismiss();
}
Intent intent = new Intent();
intent.setAction("android.intent.action.VIEW");
// 通过XUtils框架返回的文件 创建一个Uri
Uri uri = Uri.fromFile(responseInfo.result);
intent.setDataAndType(uri,
"application/vnd.android.package-archive");
// 索取结果的开启
startActivityForResult(intent, REQUEST_FOR_INSTALL);
}
@Override
public void onFailure(HttpException error, String msg) {
// TODO Auto-generated method stub
AppUtils.showToast("下载失败", SplashActivity.this);
}
});
}
// 用于获取上个界面返回的数据
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// TODO Auto-generated method stub
if (requestCode == REQUEST_FOR_INSTALL) {
// 说明是我们的界面的返回数据
// 如何确定点击的是哪个按钮
if (resultCode == RESULT_CANCELED) {
// 说明用户点击的是取消
System.out.println("用户点击了取消");
gotoHomePageActivity();
} else if (resultCode == RESULT_OK) {
System.out.println("用户点击了确定");
}
}
}
private void gotoHomePageActivity() {
Intent intent = new Intent(this, HomepageActivity.class);
startActivity(intent);
finish();
}
private void getVersionInfo() {
// 获取版本号和版本名称
// 包的管理类
PackageManager pm = getPackageManager();
// 0代表所有信息都获取
try {
// 通过一个方法获取本应用的包名
PackageInfo packageInfo = pm.getPackageInfo(getPackageName(), 0);
// PackageInfo 是一个javaBean 是系统封装的 代表对整个清单文件的封装
versionCode = packageInfo.versionCode;
versionName = packageInfo.versionName;
// ApplicationInfo 是对清单文件中 Application节点的封装
} catch (NameNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import org.json.JSONException;
import org.json.JSONObject;
import com.lidroid.xutils.HttpUtils;
import com.lidroid.xutils.exception.HttpException;
import com.lidroid.xutils.http.ResponseInfo;
import com.lidroid.xutils.http.callback.RequestCallBack;
import zz.itcast.mobilesafez20.R;
import zz.itcast.mobilesafez20.app.MobilesafeApplication;
import zz.itcast.mobilesafez20.utils.AppUtils;
import zz.itcast.mobilesafez20.utils.MyConstant;
import zz.itcast.mobilesafez20.utils.StreamTools;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.content.DialogInterface.OnCancelListener;
import android.content.DialogInterface.OnDismissListener;
import android.content.Intent;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.content.res.AssetManager;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.BitmapFactory.Options;
import android.net.Uri;
import android.os.Bundle;
import android.os.SystemClock;
import android.widget.TextView;
public class SplashActivity extends BaseActivtiy {
// 用于安装
protected static final int REQUEST_FOR_INSTALL = 1;
private int versionCode;
private String versionName;
private ProgressDialog pd;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
System.out.println("SplashActivity onCreate");
/*
* SplashActivity 闪屏界面 1.显示一个logo 广告 2-3秒消失 2.比如数据的初始化,或者表的创建等等
* 3.检测版本更新,去服务器检测一下是否有最新版本 如果有新版本弹对话框提示用户更新
*/
getVersionInfo();
// 这里自动更新 开发期间肯定是true 这里为了方便写成false
boolean isUpdate = sp.getBoolean(MyConstant.KEY_AUTO_UPDATE, false);
if (isUpdate) {
// 直接去检查版本更新 服务器 联网
checkUpdate();
} else {
// 不更新
new Thread() {
public void run() {
SystemClock.sleep(1500);
gotoHomePageActivity();
}
}.start();
}
}
private void checkUpdate() {
final String path = getString(R.string.update_url);
new Thread() {
public void run() {
try {
// 联网前睡一会
SystemClock.sleep(1500);
URL url = new URL(path);
HttpURLConnection conn = (HttpURLConnection) url
.openConnection();
conn.setRequestMethod("GET");
conn.setConnectTimeout(5000);
int code = conn.getResponseCode();
if (code == 200) {
// 联网成功
InputStream inputStream = conn.getInputStream();
// 将流转换成字符串
String jsonStr = StreamTools
.getStringFromStream(inputStream);
// 解析JSON
JSONObject jsonObj = new JSONObject(jsonStr);
// 通过键值对解析
int newCode = jsonObj.getInt("code");
String info = jsonObj.getString("info");
String apkUrl = jsonObj.getString("apkUrl");
System.out.println("新本号:" + newCode + ",新版本信息:" + info
+ ",apkurl:" + apkUrl);
// 获取到服务器版本之后 应该和本地版本做比对
if (newCode == versionCode) {
// 说明当前已经是最新版本
gotoHomePageActivity();
} else {
// 说明有新版本 弹出提示框
showUpdateDialog(info, apkUrl);
}
} else {
// 没联网成功
AppUtils.showToast("服务器忙,请稍候重试", SplashActivity.this);
gotoHomePageActivity();
}
} catch (MalformedURLException e) {
e.printStackTrace();
// 弹一个吐司 服务器忙
AppUtils.showToast("服务器忙,请稍候重试", act);
// 直接进入首页
gotoHomePageActivity();
} catch (IOException e) {
AppUtils.showToast("请检查网络设置或稍候重试", act);
// 直接进入到首页
gotoHomePageActivity();
e.printStackTrace();
} catch (JSONException e) {
AppUtils.showToast("服务器忙,请稍候重试", act);
gotoHomePageActivity();
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
gotoHomePageActivity();
AppUtils.showToast("服务器忙,请稍候重试", act);
}
}
}.start();
}
private void showUpdateDialog(String info, final String apkUrl) {
final AlertDialog.Builder builder = new Builder(this);
builder.setTitle("升级提示");
// 显示新版本的特性
builder.setMessage(info);
// 取消和确定
builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
gotoHomePageActivity();
}
});
builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// 去下载 下载的地址
downloadApk(apkUrl);
}
});
// 强制用户无法消除对话框
// builder.setCancelable(false);
// 给对话框设置一个消失的监听
builder.setOnCancelListener(new OnCancelListener() {
@Override
public void onCancel(DialogInterface dialog) {
gotoHomePageActivity();
}
});
runOnUiThread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
builder.show();
}
});
}
private void downloadApk(String apkUrl) {
HttpUtils http = new HttpUtils();
private static final String root = "项目名";
public static final String ROOT_PATH = Environment
.getExternalStorageDirectory().getPath() + "/" + root;
public static final String DOWNLOAD_PATH = ROOT_PATH + "/download";
new RequestCallBack<File>() {
// 当开始下载
@Override
public void onStart() {
// TODO Auto-generated method stub
super.onStart();
pd = new ProgressDialog(SplashActivity.this);
pd.setMessage("下载中...");
// 设置为水平进度样式
pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
pd.show();
}
// 是HttpUtils框架自带的方法 设置最大进度和当前进度
@Override
public void onLoading(long total, long current,
boolean isUploading) {
// TODO Auto-generated method stub
super.onLoading(total, current, isUploading);
if (pd != null) {
pd.setMax((int) total);
pd.setProgress((int) current);
}
}
@Override
public void onSuccess(ResponseInfo<File> responseInfo) {
// TODO Auto-generated method stub
AppUtils.showToast("下载成功", SplashActivity.this);
if (pd != null) {
pd.dismiss();
}
Intent intent = new Intent();
intent.setAction("android.intent.action.VIEW");
// 通过XUtils框架返回的文件 创建一个Uri
Uri uri = Uri.fromFile(responseInfo.result);
intent.setDataAndType(uri,
"application/vnd.android.package-archive");
// 索取结果的开启
startActivityForResult(intent, REQUEST_FOR_INSTALL);
}
@Override
public void onFailure(HttpException error, String msg) {
// TODO Auto-generated method stub
AppUtils.showToast("下载失败", SplashActivity.this);
}
});
}
// 用于获取上个界面返回的数据
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// TODO Auto-generated method stub
if (requestCode == REQUEST_FOR_INSTALL) {
// 说明是我们的界面的返回数据
// 如何确定点击的是哪个按钮
if (resultCode == RESULT_CANCELED) {
// 说明用户点击的是取消
System.out.println("用户点击了取消");
gotoHomePageActivity();
} else if (resultCode == RESULT_OK) {
System.out.println("用户点击了确定");
}
}
}
private void gotoHomePageActivity() {
Intent intent = new Intent(this, HomepageActivity.class);
startActivity(intent);
finish();
}
private void getVersionInfo() {
// 获取版本号和版本名称
// 包的管理类
PackageManager pm = getPackageManager();
// 0代表所有信息都获取
try {
// 通过一个方法获取本应用的包名
PackageInfo packageInfo = pm.getPackageInfo(getPackageName(), 0);
// PackageInfo 是一个javaBean 是系统封装的 代表对整个清单文件的封装
versionCode = packageInfo.versionCode;
versionName = packageInfo.versionName;
// ApplicationInfo 是对清单文件中 Application节点的封装
} catch (NameNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}