package cn.jianhaozhan.activity;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
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 cn.jianhaozhan.utils.StreamUtil;
import android.support.v7.app.ActionBarActivity;
import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.content.Intent;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import android.os.SystemClock;
import android.util.Xml;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;
public class SplashActivity extends ActionBarActivity {
private String code;
private String apkurl;
private String des;
private TextView tv_spalsh_plan;
protected static final int MSG_ENTER_HOME = 0;
protected static final int MSG_UPDATE_DIALOG = 1;
protected static final int MSG_URL_ERROR = 2;
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
// 有新版本弹窗更新对话框
case MSG_UPDATE_DIALOG:
showdialog();
break;
case MSG_ENTER_HOME:
enterHome();
break;
case MSG_URL_ERROR:
Toast.makeText(getApplicationContext(), "错误号" + MSG_URL_ERROR,
0).show();
break;
}
super.handleMessage(msg);
}
};
private TextView tv_spalsh_versionname;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_splash);
tv_spalsh_versionname = (TextView) findViewById(R.id.tv_spalsh_versionname);
tv_spalsh_plan = (TextView) findViewById(R.id.tv_spalsh_plan);
tv_spalsh_versionname.setText("版本号:" + getVersionName());
update();
}
/**
* 弹窗对话框
*/
protected void showdialog() {
AlertDialog.Builder builder = new Builder(this);
// 设置对话框不能消息
builder.setCancelable(false);
// 设置对话框标题
builder.setTitle("新版本" + code);
// 设置对话框图标
builder.setIcon(R.drawable.ic_launcher);
// 设置对话框描述
builder.setMessage(des);
// 设置升级/取消按钮
builder.setPositiveButton("升级", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
download();
}
});
builder.setNegativeButton("取消", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
enterHome();
}
});
// 显示对话框,不要忘记
builder.show();
}
/**
* 下载新版本
*/
protected void download() {
HttpUtils httpUtils = new HttpUtils();
// 判断SD卡是否挂载
if (Environment.getExternalStorageState().equals(
Environment.MEDIA_MOUNTED)) {
// 第一个参数下载地址,第二个下载到本地的路径,第三个参数回掉函数
httpUtils.download(apkurl, "/mnt/sdcard/mobile.apk",
new RequestCallBack<File>() {
@Override
public void onSuccess(ResponseInfo<File> arg0) {
// 下载成功
System.out.println(apkurl);
// 按照最新版本
installAPK();
}
@Override
public void onFailure(HttpException arg0, String arg1) {
// TODO Auto-generated method stub
}
@Override
public void onLoading(long total, long current,
boolean isUploading) {
super.onLoading(total, current, isUploading);
// 显示下载进度
tv_spalsh_plan.setVisibility(View.VISIBLE);
tv_spalsh_plan.setText(current + "/" + total);
}
});
}
}
/**
* 安装新版本
*/
protected void installAPK() {
/**
* <intent-filter> <action android:name="android.intent.action.VIEW" />
* <category android:name="android.intent.category.DEFAULT" /> <data
* android:scheme="content" /> //content : 从内容提供者中获取数据 content:// <data
* android:scheme="file" /> // file : 从文件中获取数据 <data
* android:mimeType="application/vnd.android.package-archive" />
* </intent-filter>
*/
Intent intent = new Intent();
intent.setAction("android.intent.action.VIEW");
intent.addCategory("android.intent.category.DEFAULT");
intent.setDataAndType(Uri.fromFile(new File("/mnt/sdcard/mobile.apk")),
"application/vnd.android.package-archive");
// 退出升级安装程序直接进入主页面
// 0是请求码,这个请求码发送给重写的onActivityResult,这个函数根据这个请求码做不同的处理。请求码类似get参数
startActivityForResult(intent, 0);// 这里需要重写onActivityResult
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// TODO Auto-generated method stub
super.onActivityResult(requestCode, resultCode, data);
enterHome();
}
/**
* 进入主界面
*/
protected void enterHome() {
Intent intent = new Intent(this, HomeActivity.class);
startActivity(intent);
// 移除界面
finish();
}
/**
* 获取当前应用版本号
*
* @return
*/
private String getVersionName() {
// 包管理者
PackageManager pm = getPackageManager();
// packageName 应用程序包名
// flags 执行信息的标签,0:获取基础信息,包名,版本号,要获取的权限
try {
// pm.getPackageInfo("cn.jianhaozhan.activity", 0);
// getPackageName获取包名
// info命名的其实就是个javabean
PackageInfo packageInfo = pm.getPackageInfo(getPackageName(), 0);
// 获取版本号
String versionName = packageInfo.versionName;
return versionName;
} catch (NameNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
/**
* 提醒用户版本更新
*/
private void update() {
new Thread() {
public void run() {
Message message = Message.obtain();
// 获取连接服务器的开始时间
int startTime = (int) System.currentTimeMillis();
// 1.1连接服务器
try {
// 1.1.1 连接路径
URL url = new URL("http://jianhaozhan.cn/updateinfo.html");
// 1.1.2获得连接对象
HttpURLConnection conn = (HttpURLConnection) url
.openConnection();
// 1.1.2设置超时时间
conn.setConnectTimeout(5000);
conn.setReadTimeout(5000);
// 设置请求方式
conn.setRequestMethod("GET");
// 获取状态码
int responseCode = conn.getResponseCode();
if (responseCode == 200) {
// 连接成功,获取服务器返回的数据code:新版本的版本号,新版本的下载路径,告诉用户增加了哪些功能
System.out.println("连接成功");
// 获取服务器返回的数据,得到服务器返回的流信息
InputStream inputStream = conn.getInputStream();
// 将服务器返回的流信息转换成字符串
String json = StreamUtil.parseStremUitl(inputStream);
// 解析json数据
JSONObject jsonObject = new JSONObject(json);
code = jsonObject.getString("code");
apkurl = jsonObject.getString("apkurl");
des = jsonObject.getString("des");
System.out.println(code + " " + apkurl + " " + des);
// 查看是否有最新版本
if (code.equals(getVersionName())) {
message.what = MSG_ENTER_HOME;
} else {
message.what = MSG_UPDATE_DIALOG;
}
} else {
System.out.println("连接失败");
message.what = MSG_URL_ERROR;
}
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
// 获取连接服务器成功的时间
int endTime = (int) System.currentTimeMillis();
// 算出连接服务器一共用了多少时间,因为有时候检测更新网络连接超过两秒
int dTime = endTime - startTime;
// 开始的splash广告画面需要显示两秒
// 连接服务器时间小于2秒睡,大于2秒不睡。
if (dTime < 2000) {
// 睡2秒
SystemClock.sleep(2000 - dTime);// 始终都是睡两秒钟的时间
}
handler.sendMessage(message);
}
}
}.start();
}
}