软件自动更新提示和安装
来源:互联网 发布:知满天教育培训怎么样 编辑:程序博客网 时间:2024/05/16 07:50
第一步:写Activity页面(用异步线程做)
package com.geek.sjws.activity;
import java.io.File;
import com.geek.sjws.MainActivity;
import com.geek.sjws.R;
import com.geek.sjws.entity.Updateinfo;
import com.geek.sjws.service.ServiceActivity;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.DialogInterface.OnClickListener;
import android.content.SharedPreferences;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
public class RenewActivity extends Activity {
ServiceActivity serviceActivity;
//虚拟机访问路径
public static final String URL = "http://10.0.2.2:8080/service/updateinfo.xml";
//真机访问路径
// public static final String URL = "http://192.168.43.13:8080/service/updateinfo.xml";
public String url2 = "";
int versionCode = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.gengxinlayout);
new renew().execute(URL);
}
// 检查更新
class renew extends AsyncTask<String, Object, Updateinfo> {
ProgressDialog pd = null;
// 异步线程启动之前调用
@Override
protected void onPreExecute() {
// TODO Auto-generated method stub
pd = new ProgressDialog(RenewActivity.this);
// 设置标题
pd.setTitle("正在开启梦幻手机");
// 设置进度条的风格
pd.show();
}
// 异步线程运行时调用
@Override
protected Updateinfo doInBackground(String... params) {
// TODO Auto-generated method stub
try {
// 拿到一个服务类的实例
serviceActivity = new ServiceActivity(RenewActivity.this);
// 调用服务类
return serviceActivity.jieXiUpdateinfo(params[0]);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
// 异步线程运行之后调用
@Override
protected void onPostExecute(Updateinfo result) {
// TODO Auto-generated method stub
try {
// 获取应用本身最新版本号
versionCode = getPackageManager().getPackageInfo(
getPackageName(), 0).versionCode;
// 判断是否为空
if (result != null) {
// 服务器的版本号比自身的版本号大就进
if (result.getVersion() > versionCode) {
// 关闭上一个对话框
pd.cancel();
//拿到服务器上的xml文件中的最新版本路径
url2 = result.getUrl();
//拿到一个对话框实例
AlertDialog.Builder ad = new AlertDialog.Builder(RenewActivity.this);
ad.setTitle("更新提示");
ad.setMessage(result.getDescription());
ad.setPositiveButton("确定", new OnClickListener() {
public void onClick(DialogInterface dialog,
int which) {
// TODO Auto-generated method stub
//启动线程下载最新版本
new banbeigengxin().execute(url2);
}
});
ad.setNegativeButton("取消", new OnClickListener() {
public void onClick(DialogInterface dialog,
int which) {
// TODO Auto-generated method stub
Toast.makeText(RenewActivity.this, "你点击的是取消",
1000).show();
//跳转页面
Intent intent = new Intent();
intent.setClass(RenewActivity.this,
MainActivity.class);
startActivityForResult(intent, 300);
}
});
ad.show();
//如果服务器的版本号不比自身的版本号大就不用更新
} else {
Intent intent = new Intent();
intent.setClass(RenewActivity.this, MainActivity.class);
startActivity(intent);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
// 异步线程任务结束之后调用
@Override
protected void onCancelled() {
}
}
// 更新版本的异步线程
class banbeigengxin extends AsyncTask<String, Object, File> {
ProgressDialog pd = null;
// 这个异步线程启动之前调用
@Override
protected void onPreExecute() {
// TODO Auto-generated method stub
pd = new ProgressDialog(RenewActivity.this);
// 设置标题
pd.setTitle("正在下载最新版本");
// 设置进度条的风格
pd.show();
super.onPreExecute();
}
// 这个异步线程启动之时调用
@Override
protected File doInBackground(String... params) {
serviceActivity = new ServiceActivity(RenewActivity.this);
return serviceActivity.downloadFile(params[0]);
}
// 这个异步线程启动之后调用
@Override
protected void onPostExecute(File result) {
System.out.println(result);
if (result != null) {
pd.cancel();
//调安装方法
install(result);
}
}
// 这个异步线程任务结束之后调用
@Override
protected void onCancelled() {
super.onCancelled();
}
}
// 安装最新版本
public void install(File file) {
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(file),"application/vnd.android.package-archive");
startActivity(intent);
}
}
第二步:写服务类方法
package com.geek.sjws.service;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.Serializable;
import java.io.StringReader;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import com.geek.sjws.entity.Updateinfo;
import android.content.Context;
import android.os.Environment;
import android.util.Xml;
public class ServiceActivity implements Serializable{
Context context;
public ServiceActivity(Context context){
this.context=context;
}
//解析Updateinfo.xml
public Updateinfo jieXiUpdateinfo(String url) throws Exception{
System.out.println("进来了++++++++++++++++");
//定义一个实体类
Updateinfo updateinfo=null;
//创建一个浏览器
HttpClient httpClient=new DefaultHttpClient();
//创建一个HttpPost请求对象
HttpPost post=new HttpPost(url);
//// 执行请求(得到相应对象)
HttpResponse response=httpClient.execute(post);
// 得到状态行获得状态码(如果==200就表示请求成功)
if(response.getStatusLine().getStatusCode()==200){
// 得到XML
String xml=EntityUtils.toString(response.getEntity());
//调用 jieXiHttpEntity(String xml)方法返回实体
updateinfo=jieXiHttpEntity(xml);
}
return updateinfo;
}
//解析服务器传过来的XML
public Updateinfo jieXiHttpEntity(String xml) throws Exception{
//定义一个实体类
Updateinfo updateinfo=null;
//获取XmlPullParser实例
XmlPullParser xpp=Xml.newPullParser();
//设置编码
xml=new String(xml.getBytes("ISO-8859-1"),"utf-8");
//设置输入流
xpp.setInput(new StringReader(xml));
//获得状态
int type=xpp.getEventType();
//拿到一个实例
updateinfo=new Updateinfo();
//如果状态不是文档尾就进while循环
while (type!=XmlPullParser.END_DOCUMENT) {
//接收返回的标签名
String filenname=xpp.getName();
//判断状态是不是开始标签
switch (type) {
//如果是开始标签
case XmlPullParser.START_TAG:
if(filenname.equalsIgnoreCase("version")){
int id=Integer.parseInt(xpp.nextText());
updateinfo.setVersion(id);
}else if(filenname.equalsIgnoreCase("description")){
String name=xpp.nextText();
updateinfo.setDescription(name);
}else if(filenname.equalsIgnoreCase("url")){
String urii=xpp.nextText();
updateinfo.setUrl(urii);
}
break;
}
type=xpp.next();
}
return updateinfo;
}
//下载最新版本的软件
public File downloadFile(String url){
File file=null;
File path=null;
String filename=null;
InputStream is=null;
OutputStream os=null;
try {
//判断SD卡状态是否存在
if(Environment.getExternalStorageState().equalsIgnoreCase(Environment.MEDIA_MOUNTED)){
//获得sd卡的路径目录
path=Environment.getExternalStorageDirectory();
//调用截取字符串的方法 把这个穿进去的路径截取出来文件名
filename=url.substring(url.lastIndexOf("/")+1);
//创建一个文件路径
file =new File(path,filename);
//判断如果文件存在的话就删除掉
if(file.exists()){
file.delete();
}
//在创建这个文件
file.createNewFile();
HttpClient httpClient =new DefaultHttpClient();
HttpPost httpPost=new HttpPost(url);
HttpResponse response=httpClient.execute(httpPost);
if (response.getStatusLine().getStatusCode()==200) {
is=response.getEntity().getContent();
os=new FileOutputStream(file);
int leng=0;
byte[] by=new byte[1024];
while ((leng=is.read(by))!=-1) {
os.write(by,0,leng);
}
}
}
} catch (Exception e) {
e.printStackTrace();
}finally{
//把两个流关闭掉
if(is!=null){
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(os!=null){
try {
os.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
return file;
}
}
package com.geek.sjws.activity;
import java.io.File;
import com.geek.sjws.MainActivity;
import com.geek.sjws.R;
import com.geek.sjws.entity.Updateinfo;
import com.geek.sjws.service.ServiceActivity;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.DialogInterface.OnClickListener;
import android.content.SharedPreferences;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
public class RenewActivity extends Activity {
ServiceActivity serviceActivity;
//虚拟机访问路径
public static final String URL = "http://10.0.2.2:8080/service/updateinfo.xml";
//真机访问路径
// public static final String URL = "http://192.168.43.13:8080/service/updateinfo.xml";
public String url2 = "";
int versionCode = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.gengxinlayout);
new renew().execute(URL);
}
// 检查更新
class renew extends AsyncTask<String, Object, Updateinfo> {
ProgressDialog pd = null;
// 异步线程启动之前调用
@Override
protected void onPreExecute() {
// TODO Auto-generated method stub
pd = new ProgressDialog(RenewActivity.this);
// 设置标题
pd.setTitle("正在开启梦幻手机");
// 设置进度条的风格
pd.show();
}
// 异步线程运行时调用
@Override
protected Updateinfo doInBackground(String... params) {
// TODO Auto-generated method stub
try {
// 拿到一个服务类的实例
serviceActivity = new ServiceActivity(RenewActivity.this);
// 调用服务类
return serviceActivity.jieXiUpdateinfo(params[0]);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
// 异步线程运行之后调用
@Override
protected void onPostExecute(Updateinfo result) {
// TODO Auto-generated method stub
try {
// 获取应用本身最新版本号
versionCode = getPackageManager().getPackageInfo(
getPackageName(), 0).versionCode;
// 判断是否为空
if (result != null) {
// 服务器的版本号比自身的版本号大就进
if (result.getVersion() > versionCode) {
// 关闭上一个对话框
pd.cancel();
//拿到服务器上的xml文件中的最新版本路径
url2 = result.getUrl();
//拿到一个对话框实例
AlertDialog.Builder ad = new AlertDialog.Builder(RenewActivity.this);
ad.setTitle("更新提示");
ad.setMessage(result.getDescription());
ad.setPositiveButton("确定", new OnClickListener() {
public void onClick(DialogInterface dialog,
int which) {
// TODO Auto-generated method stub
//启动线程下载最新版本
new banbeigengxin().execute(url2);
}
});
ad.setNegativeButton("取消", new OnClickListener() {
public void onClick(DialogInterface dialog,
int which) {
// TODO Auto-generated method stub
Toast.makeText(RenewActivity.this, "你点击的是取消",
1000).show();
//跳转页面
Intent intent = new Intent();
intent.setClass(RenewActivity.this,
MainActivity.class);
startActivityForResult(intent, 300);
}
});
ad.show();
//如果服务器的版本号不比自身的版本号大就不用更新
} else {
Intent intent = new Intent();
intent.setClass(RenewActivity.this, MainActivity.class);
startActivity(intent);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
// 异步线程任务结束之后调用
@Override
protected void onCancelled() {
}
}
// 更新版本的异步线程
class banbeigengxin extends AsyncTask<String, Object, File> {
ProgressDialog pd = null;
// 这个异步线程启动之前调用
@Override
protected void onPreExecute() {
// TODO Auto-generated method stub
pd = new ProgressDialog(RenewActivity.this);
// 设置标题
pd.setTitle("正在下载最新版本");
// 设置进度条的风格
pd.show();
super.onPreExecute();
}
// 这个异步线程启动之时调用
@Override
protected File doInBackground(String... params) {
serviceActivity = new ServiceActivity(RenewActivity.this);
return serviceActivity.downloadFile(params[0]);
}
// 这个异步线程启动之后调用
@Override
protected void onPostExecute(File result) {
System.out.println(result);
if (result != null) {
pd.cancel();
//调安装方法
install(result);
}
}
// 这个异步线程任务结束之后调用
@Override
protected void onCancelled() {
super.onCancelled();
}
}
// 安装最新版本
public void install(File file) {
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(file),"application/vnd.android.package-archive");
startActivity(intent);
}
}
第二步:写服务类方法
package com.geek.sjws.service;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.Serializable;
import java.io.StringReader;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import com.geek.sjws.entity.Updateinfo;
import android.content.Context;
import android.os.Environment;
import android.util.Xml;
public class ServiceActivity implements Serializable{
Context context;
public ServiceActivity(Context context){
this.context=context;
}
//解析Updateinfo.xml
public Updateinfo jieXiUpdateinfo(String url) throws Exception{
System.out.println("进来了++++++++++++++++");
//定义一个实体类
Updateinfo updateinfo=null;
//创建一个浏览器
HttpClient httpClient=new DefaultHttpClient();
//创建一个HttpPost请求对象
HttpPost post=new HttpPost(url);
//// 执行请求(得到相应对象)
HttpResponse response=httpClient.execute(post);
// 得到状态行获得状态码(如果==200就表示请求成功)
if(response.getStatusLine().getStatusCode()==200){
// 得到XML
String xml=EntityUtils.toString(response.getEntity());
//调用 jieXiHttpEntity(String xml)方法返回实体
updateinfo=jieXiHttpEntity(xml);
}
return updateinfo;
}
//解析服务器传过来的XML
public Updateinfo jieXiHttpEntity(String xml) throws Exception{
//定义一个实体类
Updateinfo updateinfo=null;
//获取XmlPullParser实例
XmlPullParser xpp=Xml.newPullParser();
//设置编码
xml=new String(xml.getBytes("ISO-8859-1"),"utf-8");
//设置输入流
xpp.setInput(new StringReader(xml));
//获得状态
int type=xpp.getEventType();
//拿到一个实例
updateinfo=new Updateinfo();
//如果状态不是文档尾就进while循环
while (type!=XmlPullParser.END_DOCUMENT) {
//接收返回的标签名
String filenname=xpp.getName();
//判断状态是不是开始标签
switch (type) {
//如果是开始标签
case XmlPullParser.START_TAG:
if(filenname.equalsIgnoreCase("version")){
int id=Integer.parseInt(xpp.nextText());
updateinfo.setVersion(id);
}else if(filenname.equalsIgnoreCase("description")){
String name=xpp.nextText();
updateinfo.setDescription(name);
}else if(filenname.equalsIgnoreCase("url")){
String urii=xpp.nextText();
updateinfo.setUrl(urii);
}
break;
}
type=xpp.next();
}
return updateinfo;
}
//下载最新版本的软件
public File downloadFile(String url){
File file=null;
File path=null;
String filename=null;
InputStream is=null;
OutputStream os=null;
try {
//判断SD卡状态是否存在
if(Environment.getExternalStorageState().equalsIgnoreCase(Environment.MEDIA_MOUNTED)){
//获得sd卡的路径目录
path=Environment.getExternalStorageDirectory();
//调用截取字符串的方法 把这个穿进去的路径截取出来文件名
filename=url.substring(url.lastIndexOf("/")+1);
//创建一个文件路径
file =new File(path,filename);
//判断如果文件存在的话就删除掉
if(file.exists()){
file.delete();
}
//在创建这个文件
file.createNewFile();
HttpClient httpClient =new DefaultHttpClient();
HttpPost httpPost=new HttpPost(url);
HttpResponse response=httpClient.execute(httpPost);
if (response.getStatusLine().getStatusCode()==200) {
is=response.getEntity().getContent();
os=new FileOutputStream(file);
int leng=0;
byte[] by=new byte[1024];
while ((leng=is.read(by))!=-1) {
os.write(by,0,leng);
}
}
}
} catch (Exception e) {
e.printStackTrace();
}finally{
//把两个流关闭掉
if(is!=null){
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(os!=null){
try {
os.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
return file;
}
}
0 0
- 软件自动更新提示和安装
- 关闭wordpress自动更新和提示功能
- 自动更新软件
- 禁用sublime自动更新提示
- Android提示自动更新
- 关闭sublime提示自动更新
- subline 取消自动更新提示
- linux 软件安装提示错误
- C/S自动更新软件
- .net winform软件自动更新
- 软件自动更新思路
- Android软件的自动更新
- 软件自动更新测试
- Android软件自动更新
- android自动更新软件版本
- 软件自动更新设计///先转后看。
- C# 软件自动更新升级
- 软件功能自动更新方法
- 现谰泄壳诜评细缺窖栋毒刹郝抗刹
- ecshop广告调用方法总结
- leetcode-Largest Rectangle in Histogram
- 优游娱乐总代不多了【总代Q941494533】胁
- JQuery方法参考大全
- 软件自动更新提示和安装
- stdint.h 文件 int8_t uint8_t int16_t uint16_t (一)
- socketpair理解
- MacBook如何设置一键锁屏或者快捷锁屏?
- 【剑指offer】题目1508:把字符串转换成整数
- Android应用开发--Http
- 外观模式c++代码实现
- 优游娱乐总代上哪找啊【总代Q941494533】惩
- Mac Terminal 笔记