Android检测版本更新.docx
《Android检测版本更新.docx》由会员分享,可在线阅读,更多相关《Android检测版本更新.docx(15页珍藏版)》请在冰豆网上搜索。
Android检测版本更新
一、准备
1.检测当前版本的信息AndroidManifest.xml-->manifest-->android:
versionName。
2.从服务器获取版本号(版本号存在于xml文件中)并与当前检测到的版本进行匹配,如果不匹配,提示用户进行升级,如果匹配则进入程序主界面。
3.当提示用户进行版本升级时,如果用户点击了确定,系统将自动从服务器上下载并进行自动升级,如果点击取消将进入程序主界面。
二、效果图
三、必要说明
服务器端存储apk文件,同时有version.xml文件便于比对更新。
xmlversion="1.0"encoding="utf-8"?
>
2.0
http:
//192.168.1.187:
8080/mobilesafe.apk
检测到最新版本,请及时更新!
//192.168.1.99/version.xml
通过一个实体类获取上述信息。
packagecom.android;
publicclassUpdataInfo{
privateStringversion;
privateStringurl;
privateStringdescription;
privateStringurl_server;
publicStringgetUrl_server(){
returnurl_server;
}
publicvoidsetUrl_server(Stringurl_server){
this.url_server=url_server;
publicStringgetVersion(){
returnversion;
publicvoidsetVersion(Stringversion){
this.version=version;
publicStringgetUrl(){
returnurl;
publicvoidsetUrl(Stringurl){
this.url=url;
publicStringgetDescription(){
returndescription;
publicvoidsetDescription(Stringdescription){
this.description=description;
apk和版本信息地址都放在服务器端的version.xml里比较方便,当然如果服务器端不变动,apk地址可以放在strings.xml里,不过版本号信息是新的,必须放在服务器端,xml地址放在strings.xml。
HelloWorld,VersionActivity!
Version
不知道读者发现没有,笔者犯了个错误,那就是url_server地址必须放在本地,否则怎么读取version.xml,所以url_server不必在实体类和version里添加,毕竟是现需要version地址也就是url_server,才能够读取version。
三、代码实现
android="android:layout_width="fill_parent"android:layout_height="fill_parent"android:orientation="vertical">android:id="@+id/btn_getVersion"android:text="检查更新"android:layout_width="wrap_content"android:layout_height="wrap_content"/>packagecom.android;importjava.io.InputStream;importorg.xmlpull.v1.XmlPullParser;importandroid.util.Xml;publicclassUpdataInfoParser{publicstaticUpdataInfogetUpdataInfo(InputStreamis)throwsException{XmlPullParserparser=Xml.newPullParser();parser.setInput(is,"utf-8");inttype=parser.getEventType();UpdataInfoinfo=newUpdataInfo();while(type!=XmlPullParser.END_DOCUMENT){switch(type){caseXmlPullParser.START_TAG:if("version".equals(parser.getName())){info.setVersion(parser.nextText());}elseif("url".equals(parser.getName())){info.setUrl(parser.nextText());}elseif("description".equals(parser.getName())){info.setDescription(parser.nextText());}break;}type=parser.next();}returninfo;}}packagecom.android;importjava.io.File;importjava.io.InputStream;import.HttpURLConnection;import.URL;importandroid.app.Activity;importandroid.app.AlertDialog;importandroid.app.AlertDialog.Builder;importandroid.app.ProgressDialog;importandroid.content.DialogInterface;importandroid.content.Intent;importandroid.content.pm.PackageInfo;importandroid.content.pm.PackageManager;import.Uri;importandroid.os.Bundle;importandroid.os.Environment;importandroid.os.Handler;importandroid.os.Message;importandroid.util.Log;importandroid.view.View;importandroid.view.View.OnClickListener;importandroid.widget.Button;importandroid.widget.TextView;importandroid.widget.Toast;publicclassVersionActivityextendsActivity{privatefinalStringTAG=this.getClass().getName();privatefinalintUPDATA_NONEED=0;privatefinalintUPDATA_CLIENT=1;privatefinalintGET_UNDATAINFO_ERROR=2;privatefinalintSDCARD_NOMOUNTED=3;privatefinalintDOWN_ERROR=4;privateButtongetVersion;privateUpdataInfoinfo;privateStringlocalVersion;@OverridepublicvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.main);getVersion=(Button)findViewById(R.id.btn_getVersion);getVersion.setOnClickListener(newOnClickListener(){@OverridepublicvoidonClick(Viewv){try{localVersion=getVersionName();CheckVersionTaskcv=newCheckVersionTask();newThread(cv).start();}catch(Exceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}}});}privateStringgetVersionName()throwsException{//getPackageName()是你当前类的包名,0代表是获取版本信息PackageManagerpackageManager=getPackageManager();PackageInfopackInfo=packageManager.getPackageInfo(getPackageName(),0);returnpackInfo.versionName;}publicclassCheckVersionTaskimplementsRunnable{InputStreamis;publicvoidrun(){try{Stringpath=getResources().getString(R.string.url_server);URLurl=newURL(path);HttpURLConnectionconn=(HttpURLConnection)url.openConnection();conn.setConnectTimeout(5000);conn.setRequestMethod("GET");intresponseCode=conn.getResponseCode();if(responseCode==200){//从服务器获得一个输入流is=conn.getInputStream();}info=UpdataInfoParser.getUpdataInfo(is);if(info.getVersion().equals(localVersion)){Log.i(TAG,"版本号相同");Messagemsg=newMessage();msg.what=UPDATA_NONEED;handler.sendMessage(msg);//LoginMain();}else{Log.i(TAG,"版本号不相同");Messagemsg=newMessage();msg.what=UPDATA_CLIENT;handler.sendMessage(msg);}}catch(Exceptione){Messagemsg=newMessage();msg.what=GET_UNDATAINFO_ERROR;handler.sendMessage(msg);e.printStackTrace();}}}Handlerhandler=newHandler(){@OverridepublicvoidhandleMessage(Messagemsg){//TODOAuto-generatedmethodstubsuper.handleMessage(msg);switch(msg.what){caseUPDATA_NONEED:Toast.makeText(getApplicationContext(),"不需要更新",Toast.LENGTH_SHORT).show();caseUPDATA_CLIENT://对话框通知用户升级程序showUpdataDialog();break;caseGET_UNDATAINFO_ERROR://服务器超时Toast.makeText(getApplicationContext(),"获取服务器更新信息失败",1).show();break;caseDOWN_ERROR://下载apk失败Toast.makeText(getApplicationContext(),"下载新版本失败",1).show();break;}}};/***弹出对话框通知用户更新程序**弹出对话框的步骤:*1.创建alertDialog的builder.*2.要给builder设置属性,对话框的内容,样式,按钮*3.通过builder创建一个对话框*4.对话框show()出来*/protectedvoidshowUpdataDialog(){AlertDialog.Builderbuiler=newBuilder(this);builer.setTitle("版本升级");builer.setMessage(info.getDescription());//当点确定按钮时从服务器上下载新的apk然后安装װbuiler.setPositiveButton("确定",newDialogInterface.OnClickListener(){publicvoidonClick(DialogInterfacedialog,intwhich){Log.i(TAG,"下载apk,更新");downLoadApk();}});builer.setNegativeButton("取消",newDialogInterface.OnClickListener(){publicvoidonClick(DialogInterfacedialog,intwhich){//TODOAuto-generatedmethodstub//dosth}});AlertDialogdialog=builer.create();dialog.show();}/**从服务器中下载APK*/protectedvoiddownLoadApk(){finalProgressDialogpd;//进度条对话框pd=newProgressDialog(this);pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);pd.setMessage("正在下载更新");pd.show();newThread(){@Overridepublicvoidrun(){try{Filefile=DownLoadManager.getFileFromServer(info.getUrl(),pd);sleep(3000);installApk(file);pd.dismiss();//结束掉进度条对话框}catch(Exceptione){Messagemsg=newMessage();msg.what=DOWN_ERROR;handler.sendMessage(msg);e.printStackTrace();}}}.start();}//安装apkprotectedvoidinstallApk(Filefile){Intentintent=newIntent();//执行动作intent.setAction(Intent.ACTION_VIEW);//执行的数据类型intent.setDataAndType(Uri.fromFile(file),"application/vnd.android.package-archive");startActivity(intent);}}packagecom.android;importjava.io.BufferedInputStream;importjava.io.File;importjava.io.FileOutputStream;importjava.io.InputStream;import.HttpURLConnection;import.URL;importandroid.app.ProgressDialog;importandroid.os.Environment;publicclassDownLoadManager{publicstaticFilegetFileFromServer(Stringpath,ProgressDialogpd)throwsException{//如果相等的话表示当前的sdcard挂载在手机上并且是可用的if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){URLurl=newURL(path);HttpURLConnectionconn=(HttpURLConnection)url.openConnection();conn.setConnectTimeout(5000);//获取到文件的大小pd.setMax(conn.getContentLength());InputStreamis=conn.getInputStream();Filefile=newFile(Environment.getExternalStorageDirectory(),"updata.apk");FileOutputStreamfos=newFileOutputStream(file);BufferedInputStreambis=newBufferedInputStream(is);byte[]buffer=newbyte[1024];intlen;inttotal=0;while((len=bis.read(buffer))!=-1){fos.write(buffer,0,len);total+=len;//获取当前下载量pd.setProgress(total);}fos.close();bis.close();is.close();returnfile;}else{returnnull;}}}name="android.permission.INTERNET"/>name="android.permission.WRITE_EXTERNAL_STORAGE"/>四、参考文献
android="
android:
layout_width="fill_parent"
layout_height="fill_parent"
orientation="vertical">
android:id="@+id/btn_getVersion"android:text="检查更新"android:layout_width="wrap_content"android:layout_height="wrap_content"/>packagecom.android;importjava.io.InputStream;importorg.xmlpull.v1.XmlPullParser;importandroid.util.Xml;publicclassUpdataInfoParser{publicstaticUpdataInfogetUpdataInfo(InputStreamis)throwsException{XmlPullParserparser=Xml.newPullParser();parser.setInput(is,"utf-8");inttype=parser.getEventType();UpdataInfoinfo=newUpdataInfo();while(type!=XmlPullParser.END_DOCUMENT){switch(type){caseXmlPullParser.START_TAG:if("version".equals(parser.getName())){info.setVersion(parser.nextText());}elseif("url".equals(parser.getName())){info.setUrl(parser.nextText());}elseif("description".equals(parser.getName())){info.setDescription(parser.nextText());}break;}type=parser.next();}returninfo;}}packagecom.android;importjava.io.File;importjava.io.InputStream;import.HttpURLConnection;import.URL;importandroid.app.Activity;importandroid.app.AlertDialog;importandroid.app.AlertDialog.Builder;importandroid.app.ProgressDialog;importandroid.content.DialogInterface;importandroid.content.Intent;importandroid.content.pm.PackageInfo;importandroid.content.pm.PackageManager;import.Uri;importandroid.os.Bundle;importandroid.os.Environment;importandroid.os.Handler;importandroid.os.Message;importandroid.util.Log;importandroid.view.View;importandroid.view.View.OnClickListener;importandroid.widget.Button;importandroid.widget.TextView;importandroid.widget.Toast;publicclassVersionActivityextendsActivity{privatefinalStringTAG=this.getClass().getName();privatefinalintUPDATA_NONEED=0;privatefinalintUPDATA_CLIENT=1;privatefinalintGET_UNDATAINFO_ERROR=2;privatefinalintSDCARD_NOMOUNTED=3;privatefinalintDOWN_ERROR=4;privateButtongetVersion;privateUpdataInfoinfo;privateStringlocalVersion;@OverridepublicvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.main);getVersion=(Button)findViewById(R.id.btn_getVersion);getVersion.setOnClickListener(newOnClickListener(){@OverridepublicvoidonClick(Viewv){try{localVersion=getVersionName();CheckVersionTaskcv=newCheckVersionTask();newThread(cv).start();}catch(Exceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}}});}privateStringgetVersionName()throwsException{//getPackageName()是你当前类的包名,0代表是获取版本信息PackageManagerpackageManager=getPackageManager();PackageInfopackInfo=packageManager.getPackageInfo(getPackageName(),0);returnpackInfo.versionName;}publicclassCheckVersionTaskimplementsRunnable{InputStreamis;publicvoidrun(){try{Stringpath=getResources().getString(R.string.url_server);URLurl=newURL(path);HttpURLConnectionconn=(HttpURLConnection)url.openConnection();conn.setConnectTimeout(5000);conn.setRequestMethod("GET");intresponseCode=conn.getResponseCode();if(responseCode==200){//从服务器获得一个输入流is=conn.getInputStream();}info=UpdataInfoParser.getUpdataInfo(is);if(info.getVersion().equals(localVersion)){Log.i(TAG,"版本号相同");Messagemsg=newMessage();msg.what=UPDATA_NONEED;handler.sendMessage(msg);//LoginMain();}else{Log.i(TAG,"版本号不相同");Messagemsg=newMessage();msg.what=UPDATA_CLIENT;handler.sendMessage(msg);}}catch(Exceptione){Messagemsg=newMessage();msg.what=GET_UNDATAINFO_ERROR;handler.sendMessage(msg);e.printStackTrace();}}}Handlerhandler=newHandler(){@OverridepublicvoidhandleMessage(Messagemsg){//TODOAuto-generatedmethodstubsuper.handleMessage(msg);switch(msg.what){caseUPDATA_NONEED:Toast.makeText(getApplicationContext(),"不需要更新",Toast.LENGTH_SHORT).show();caseUPDATA_CLIENT://对话框通知用户升级程序showUpdataDialog();break;caseGET_UNDATAINFO_ERROR://服务器超时Toast.makeText(getApplicationContext(),"获取服务器更新信息失败",1).show();break;caseDOWN_ERROR://下载apk失败Toast.makeText(getApplicationContext(),"下载新版本失败",1).show();break;}}};/***弹出对话框通知用户更新程序**弹出对话框的步骤:*1.创建alertDialog的builder.*2.要给builder设置属性,对话框的内容,样式,按钮*3.通过builder创建一个对话框*4.对话框show()出来*/protectedvoidshowUpdataDialog(){AlertDialog.Builderbuiler=newBuilder(this);builer.setTitle("版本升级");builer.setMessage(info.getDescription());//当点确定按钮时从服务器上下载新的apk然后安装װbuiler.setPositiveButton("确定",newDialogInterface.OnClickListener(){publicvoidonClick(DialogInterfacedialog,intwhich){Log.i(TAG,"下载apk,更新");downLoadApk();}});builer.setNegativeButton("取消",newDialogInterface.OnClickListener(){publicvoidonClick(DialogInterfacedialog,intwhich){//TODOAuto-generatedmethodstub//dosth}});AlertDialogdialog=builer.create();dialog.show();}/**从服务器中下载APK*/protectedvoiddownLoadApk(){finalProgressDialogpd;//进度条对话框pd=newProgressDialog(this);pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);pd.setMessage("正在下载更新");pd.show();newThread(){@Overridepublicvoidrun(){try{Filefile=DownLoadManager.getFileFromServer(info.getUrl(),pd);sleep(3000);installApk(file);pd.dismiss();//结束掉进度条对话框}catch(Exceptione){Messagemsg=newMessage();msg.what=DOWN_ERROR;handler.sendMessage(msg);e.printStackTrace();}}}.start();}//安装apkprotectedvoidinstallApk(Filefile){Intentintent=newIntent();//执行动作intent.setAction(Intent.ACTION_VIEW);//执行的数据类型intent.setDataAndType(Uri.fromFile(file),"application/vnd.android.package-archive");startActivity(intent);}}packagecom.android;importjava.io.BufferedInputStream;importjava.io.File;importjava.io.FileOutputStream;importjava.io.InputStream;import.HttpURLConnection;import.URL;importandroid.app.ProgressDialog;importandroid.os.Environment;publicclassDownLoadManager{publicstaticFilegetFileFromServer(Stringpath,ProgressDialogpd)throwsException{//如果相等的话表示当前的sdcard挂载在手机上并且是可用的if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){URLurl=newURL(path);HttpURLConnectionconn=(HttpURLConnection)url.openConnection();conn.setConnectTimeout(5000);//获取到文件的大小pd.setMax(conn.getContentLength());InputStreamis=conn.getInputStream();Filefile=newFile(Environment.getExternalStorageDirectory(),"updata.apk");FileOutputStreamfos=newFileOutputStream(file);BufferedInputStreambis=newBufferedInputStream(is);byte[]buffer=newbyte[1024];intlen;inttotal=0;while((len=bis.read(buffer))!=-1){fos.write(buffer,0,len);total+=len;//获取当前下载量pd.setProgress(total);}fos.close();bis.close();is.close();returnfile;}else{returnnull;}}}name="android.permission.INTERNET"/>name="android.permission.WRITE_EXTERNAL_STORAGE"/>四、参考文献
id="@+id/btn_getVersion"
text="检查更新"
layout_width="wrap_content"
layout_height="wrap_content"/>
importjava.io.InputStream;
importorg.xmlpull.v1.XmlPullParser;
importandroid.util.Xml;
publicclassUpdataInfoParser{
publicstaticUpdataInfogetUpdataInfo(InputStreamis)throwsException{
XmlPullParserparser=Xml.newPullParser();
parser.setInput(is,"utf-8");
inttype=parser.getEventType();
UpdataInfoinfo=newUpdataInfo();
while(type!
=XmlPullParser.END_DOCUMENT){
switch(type){
caseXmlPullParser.START_TAG:
if("version".equals(parser.getName())){
info.setVersion(parser.nextText());
}elseif("url".equals(parser.getName())){
info.setUrl(parser.nextText());
}elseif("description".equals(parser.getName())){
info.setDescription(parser.nextText());
break;
type=parser.next();
returninfo;
importjava.io.File;
import.HttpURLConnection;
import.URL;
importandroid.app.Activity;
importandroid.app.AlertDialog;
importandroid.app.AlertDialog.Builder;
importandroid.app.ProgressDialog;
importandroid.content.DialogInterface;
importandroid.content.Intent;
importandroid.content.pm.PackageInfo;
importandroid.content.pm.PackageManager;
import.Uri;
importandroid.os.Bundle;
importandroid.os.Environment;
importandroid.os.Handler;
importandroid.os.Message;
importandroid.util.Log;
importandroid.view.View;
importandroid.view.View.OnClickListener;
importandroid.widget.Button;
importandroid.widget.TextView;
importandroid.widget.Toast;
publicclassVersionActivityextendsActivity{
privatefinalStringTAG=this.getClass().getName();
privatefinalintUPDATA_NONEED=0;
privatefinalintUPDATA_CLIENT=1;
privatefinalintGET_UNDATAINFO_ERROR=2;
privatefinalintSDCARD_NOMOUNTED=3;
privatefinalintDOWN_ERROR=4;
privateButtongetVersion;
privateUpdataInfoinfo;
privateStringlocalVersion;
@Override
publicvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
getVersion=(Button)findViewById(R.id.btn_getVersion);
getVersion.setOnClickListener(newOnClickListener(){
publicvoidonClick(Viewv){
try{
localVersion=getVersionName();
CheckVersionTaskcv=newCheckVersionTask();
newThread(cv).start();
}catch(Exceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
});
privateStringgetVersionName()throwsException{
//getPackageName()是你当前类的包名,0代表是获取版本信息
PackageManagerpackageManager=getPackageManager();
PackageInfopackInfo=packageManager.getPackageInfo(getPackageName(),
0);
returnpackInfo.versionName;
publicclassCheckVersionTaskimplementsRunnable{
InputStreamis;
publicvoidrun(){
Stringpath=getResources().getString(R.string.url_server);
URLurl=newURL(path);
HttpURLConnectionconn=(HttpURLConnection)url
.openConnection();
conn.setConnectTimeout(5000);
conn.setRequestMethod("GET");
intresponseCode=conn.getResponseCode();
if(responseCode==200){
//从服务器获得一个输入流
is=conn.getInputStream();
info=UpdataInfoParser.getUpdataInfo(is);
if(info.getVersion().equals(localVersion)){
Log.i(TAG,"版本号相同");
Messagemsg=newMessage();
msg.what=UPDATA_NONEED;
handler.sendMessage(msg);
//LoginMain();
}else{
Log.i(TAG,"版本号不相同");
msg.what=UPDATA_CLIENT;
msg.what=GET_UNDATAINFO_ERROR;
Handlerhandler=newHandler(){
publicvoidhandleMessage(Messagemsg){
//TODOAuto-generatedmethodstub
super.handleMessage(msg);
switch(msg.what){
caseUPDATA_NONEED:
Toast.makeText(getApplicationContext(),"不需要更新",
Toast.LENGTH_SHORT).show();
caseUPDATA_CLIENT:
//对话框通知用户升级程序
showUpdataDialog();
caseGET_UNDATAINFO_ERROR:
//服务器超时
Toast.makeText(getApplicationContext(),"获取服务器更新信息失败",1).show();
caseDOWN_ERROR:
//下载apk失败
Toast.makeText(getApplicationContext(),"下载新版本失败",1).show();
};
/*
*
*弹出对话框通知用户更新程序
*弹出对话框的步骤:
*1.创建alertDialog的builder.
*2.要给builder设置属性,对话框的内容,样式,按钮
*3.通过builder创建一个对话框
*4.对话框show()出来
*/
protectedvoidshowUpdataDialog(){
AlertDialog.Builderbuiler=newBuilder(this);
builer.setTitle("版本升级");
builer.setMessage(info.getDescription());
//当点确定按钮时从服务器上下载新的apk然后安装װ
builer.setPositiveButton("确定",newDialogInterface.OnClickListener(){
publicvoidonClick(DialogInterfacedialog,intwhich){
Log.i(TAG,"下载apk,更新");
downLoadApk();
builer.setNegativeButton("取消",newDialogInterface.OnClickListener(){
//dosth
AlertDialogdialog=builer.create();
dialog.show();
*从服务器中下载APK
protectedvoiddownLoadApk(){
finalProgressDialogpd;//进度条对话框
pd=newProgressDialog(this);
pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
pd.setMessage("正在下载更新");
pd.show();
newThread(){
Filefile=DownLoadManager.getFileFromServer(info.getUrl(),pd);
sleep(3000);
installApk(file);
pd.dismiss();//结束掉进度条对话框
msg.what=DOWN_ERROR;
}}.start();
//安装apk
protectedvoidinstallApk(Filefile){
Intentintent=newIntent();
//执行动作
intent.setAction(Intent.ACTION_VIEW);
//执行的数据类型
intent.setDataAndType(Uri.fromFile(file),"application/vnd.android.package-archive");
startActivity(intent);
importjava.io.BufferedInputStream;
importjava.io.FileOutputStream;
publicclassDownLoadManager{
publicstaticFilegetFileFromServer(Stringpath,ProgressDialogpd)throwsException{
//如果相等的话表示当前的sdcard挂载在手机上并且是可用的
if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
HttpURLConnectionconn=(HttpURLConnection)url.openConnection();
//获取到文件的大小
pd.setMax(conn.getContentLength());
InputStreamis=conn.getInputStream();
Filefile=newFile(Environment.getExternalStorageDirectory(),"updata.apk");
FileOutputStreamfos=newFileOutputStream(file);
BufferedInputStreambis=newBufferedInputStream(is);
byte[]buffer=newbyte[1024];
intlen;
inttotal=0;
while((len=bis.read(buffer))!
=-1){
fos.write(buffer,0,len);
total+=len;
//获取当前下载量
pd.setProgress(total);
fos.close();
bis.close();
is.close();
returnfile;
else{
returnnull;
name="android.permission.INTERNET"/>name="android.permission.WRITE_EXTERNAL_STORAGE"/>四、参考文献
name="android.permission.INTERNET"/>
name="android.permission.WRITE_EXTERNAL_STORAGE"/>四、参考文献
name="android.permission.WRITE_EXTERNAL_STORAGE"/>
四、参考文献
下载文档到电脑,查找使用更方便
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
copyright@ 2008-2022 冰点文档网站版权所有
经营许可证编号:鄂ICP备2022015515号-1