这几天想自己做一个文件更新的功能,但是由于不知道怎样写服务端,所以一直没有去做,后来发现原来服务端编写简直是太简单了,所以今天就实现了
版本更新的这样一个功能。
一搭建版本更新服务器:
搭建这个一个服务器其实很简单,或者说根本就谈不上什么搭建。就是将你要更新的文件以及这个更新文件的配置文件放在Tomcat目录下(也可以是其他
的服务器,如:nigix),保存这个配置文件的路径,将你所要更新文件的信息,如:版本,文件路径,文件名等等保存在配置文件中,然后在客户端根据你
所保存的配置文件的路径,读取配置文件的信息,根据配置文件中的信息去决定是否要更新。具体步骤如下:
1、搭建Tomcat服务器,配置好能够正常运行(这里不详细写了,网上教程太多了)
2、编写配置xml文件,我的文件信息如下:
<?xml version="1.0" encoding="UTF-8"?>
<update>
<name>ITalkie_picc.apk</name>
<versionCode>23</versionCode>
<url>http://192.168.1.101:8080/app/ITalkie_picc.apk</url>
</update>
这个文件中的内容可以根据自己的需要去编写,前面的标识符如:name,url,等可以自定义。
3、在tomcat-6.0.37\webapps路径下新建一个文件夹app,将你的配置文件以及要下载更新的文件(我这里要更新的文件为ITalkie_picc.apk)放入这个新
建的文件中。
4、启动Tomcat,在浏览器输入:http://192.168.1.101:8080/app/update.xml 看是否能够正常加载xml中的信息,在浏览其中输入:
http://192.168.1.101:8080/app/ITalkie_picc.apk,看是否能够正常下载你所要更新的文件。如果一切正常,那么你所想的服务端便编写好了,真的很简单
这里记住,在浏览器中输入的地址不必带有Tomcat的文件路径如:你在webapps文件下创建app文件,在浏览器输入地址时不必带有webapps名字,只
需要输入你的文件在app下的路径即可。
二客户端更新功能:
主要有以下几个步骤:
1、在更新前要检查网络情况
2、根据保存的xml路径,解析xml文件,获取xml中的信息,根据这个信息来决定是否下载更新
3、如果决定下载更新,那么启动系统的download服务,设置好相关信息
4、下载完成后,启动系统的安装界面让用户选择安装。
下面放上主要代码:
一设置系统DownloadManager的相关信息:
public class SystemDownLoad {
Context context;
String url,path,name;
public SystemDownLoad(Context context,String url,String name,String path){
this.context = context;
this.url = url;
this.name = name;
this.path = path;
}
public void downLoad(){
if(url!=null && name!=null && path!=null){
DownloadManager download = (DownloadManager)context.getSystemService(Context.DOWNLOAD_SERVICE);
Uri uri = Uri.parse(url);
Request request = new Request(uri);
request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_MOBILE|DownloadManager.Request.NETWORK_WIFI);
request.setVisibleInDownloadsUi(true);//设置是否显示下载的notification
request.setTitle(name);
request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
request.setDestinationInExternalPublicDir(path, "ITalkie_picc.apk");
//设置下载文件的存放外部路径以及文件名,如果下载的是音乐等文件,这样设置能够让其他音乐扫描到。
long id = download.enqueue(request);//将请求放入下载请求队列,并返回标志id
SharedPreferences spf = context.getSharedPreferences("download", Activity.MODE_PRIVATE);
SharedPreferences.Editor editor = spf.edit();
editor.putLong("download_id", id);//保存下载ID
editor.commit();
}
}
}
二编写下载完成后的BroadCastReceive,自动弹出安装界面:
public class DownLoadReceive extends BroadcastReceiver{
DownloadManager downloadManager;
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if(action.equals(DownloadManager.ACTION_DOWNLOAD_COMPLETE)){
Log.i("DownLoadReceive", "收到数据");
long id = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, 0);
downloadManager = (DownloadManager)context.getSystemService(Context.DOWNLOAD_SERVICE);
SharedPreferences spf = context.getSharedPreferences("download", Activity.MODE_PRIVATE);
long download_id = spf.getLong("download_id",0);
Query query = new Query();
query.setFilterById(id);
Cursor cursor = downloadManager.query(query);
String path =null;
if(cursor.moveToFirst()){
int columnIndex = cursor.getColumnIndex(DownloadManager.COLUMN_STATUS);
if (DownloadManager.STATUS_SUCCESSFUL == cursor.getInt(columnIndex)) {
String uriString = cursor.getString(cursor.getColumnIndex(DownloadManager.COLUMN_LOCAL_URI));
//上面获取的uriString 是所下载的apk uri路径,而不是这个apk的路径,所以要将uri转化成文件的路径
Uri uri = Uri.parse(uriString);
path = uri.getPath();
}
cursor.close();
}
if(id == download_id && path !=null){
installApk(path,context);
}
}
}
private void installApk(String path,Context context){
File file = new File(path);
if(!file.exists()){
Log.i("DownLoadReceive", "文件不存在");
return ;
}
// 通过Intent安装apk文件,自动打开安装界面
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(file),
"application/vnd.android.package-archive");
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
//由于是在BroadcastReceive中启动activity,所以启动方式必须设置为FLAG_ACTIVITY_NEW_TASK
context.startActivity(intent);
}
}
这样下载更新的功能便做完了,完整的代码我会上传到github上,需要的可以去pull下来。https://github.com/lonuery/DownloadUpdate.git