欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    Android程序设计基础 第7章 后台服务.ppt

    • 资源ID:87081786       资源大小:1.58MB        全文页数:116页
    • 资源格式: PPT        下载积分:15金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要15金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    Android程序设计基础 第7章 后台服务.ppt

    第第7章章 后台服务后台服务本章学习目标n了解Service的原理和用途n掌握进程内服务的管理方法n掌握服务的隐式启动和显式启动方法n了解线程的启动、挂起和停止方法n了解跨线程的界面更新方法n掌握跨进程服务的绑定和调用方法n了解AIDL语言的用途和语法 7.1 Service简介 nServiceqService是Android系统的后台服务组件,适用于开发无界面、长时间运行的应用功能q 特点n没有用户界面n比Activity 的优先级高,不会轻易被Android系统终止n即使Service被系统终止,在系统资源恢复后Service也将自动恢复运行状态n用于进程间通信(Inter Process Communication,IPC),解决两个不同Android应用程序进程之间的调用和通讯问题7.1 Service简介 nService生命周期qService生命周期包括n全生命周期n活动生命周期nonCreate()事件回调函数:Service的生命周期开始,完成Service的初始化工作nonStart()事件回调函数:活动生命周期开始,但没有与之对应的“停止”函数,因此可以近似认为活动生命周期也是以onDestroy()标志结束nonDestroy()事件回调函数:Service的生命周期结束,释放Service所有占用的资源7.1 Service简介 nService使用方法q启动方式q绑定方式n启动方式q通过调用Context.startService()启动Service,通过调用Context.stopService()或Service.stopSefl()停止ServicenService是由其他的组件启动的,但停止过程可以通过其他组件或自身完成n如果仅以启动方式使用的Service,这个Service需要具备自管理的能力,且不需要通过函数调用向外部组件提供数据或功能7.1 Service简介 n绑定方式q通过服务链接(Connection)或直接获取Service中状态和数据信息n服务链接能够获取Service的对象,因此绑定Service的组件可以调用Service中的实现的函数n使用Service的组件通过Context.bindService()建立服务链接,通过Context.unbindService()停止服务链接n如果在绑定过程中Service没有启动,Context.bindService()会自动启动Servicen同一个Service可以绑定多个服务链接,这样可以同时为多个不同的组件提供服务7.1 Service简介 n启动方式和绑定方式的结合q这两种使用方法并不是完全独立的,在某些情况下可以混合使用n以MP3播放器为例,在后台的工作的Service通过Context.startService()启动某个特定音乐播放,但在播放过程中如果用户需要暂停音乐播放,则需要通过Context.bindService()获取服务链接和Service对象,进而通过调用Service的对象中的函数,暂停音乐播放过程,并保存相关信息。在这种情况下,如果调用Context.stopService()并不能够停止Service,需要在所有的服务链接关闭后,Service才能够真正的停止7.2 本地服务n7.2.1 服务管理q服务管理主要指服务的启动和停止q首先介绍实现Service的最小代码集n第1行到第3行引入必要包n第5行声明了RandomService继承android.app.Service类n在第7行到第9行重载了onBind()函数1.import android.app.Service;2.import android.content.Intent;3.import android.os.IBinder;4.5.public class RandomService extends Service6.Override7.public IBinder onBind(Intent intent)8.return null;9.10.7.2 本地服务n7.2.1 服务管理qonBind()函数是在Service被绑定后调用的函数,能够返回Service的对象,在后面的内容中会详细介绍qService的最小代码集并不能完成任何实际的功能,需要重载onCreate()、onStart()和onDestroy(),才使Service具有实际意义nAndroid系统在创建Service时,会自动调用onCreate()完成必要的初始化工作n在Service没有必要再存在时,系统会自动调用onDestroy(),释放所有占用的资源n通过Context.startService(Intent)启动Service时,onStart()则会被系统调用,Intent会传递给Service一些重要的参数qService会根据实际情况选择需要重载上面的三个函数7.2 本地服务n7.2.1 服务管理n第4行、第8行和第12行的代码重载onCreate()、onStart()和onDestroy()三个函数时,必须要在代码中调用父函数1.public class RandomService extends Service2.Override3.public void onCreate()4.super.onCreate();5.6.Override7.public void onStart(Intent intent,int startId)8.super.onStart(intent,startId);9.10.Override11.public void onDestroy()12.super.onDestroy();13.14.7.2 本地服务n7.2.1 服务管理q注册Servicen在AndroidManifest.xml文件中注册,否则,这个Service根本无法启动nAndroidManifest.xml文件中注册Service的代码如下n使用标签声明服务,其中的android:name表示的是Service的类名称,一定要与用户建立的Service类名称一致1.7.2 本地服务n7.2.1 服务管理q启动Servicen启动方式q显示启动q隐式启动n显示启动:在Intent中指明Service所在的类,并调用startService(Intent)函数启动Service,示例代码如下q在Intent中指明启动的Service在RandomSerevice.class中1.final Intent serviceIntent=new Intent(this,RandomService.class);2.startService(serviceIntent);7.2 本地服务n7.2.1 服务管理q启动Servicen隐式启动:在注册Service时,声明Intent-filter的action属性q设置Intent的action属性,可以在不声明Service所在类的情况下启动服务n隐式启动的代码如下1.2.3.4.5.1.final Intent serviceIntent=new Intent();2.serviceIntent.setAction(edu.hrbeu.RandomService);7.2 本地服务n7.2.1 服务管理q启动Servicen若Service和调用服务的组件在同一个应用程序中,可以使用显式启动或隐式启动,显式启动更加易于使用,且代码简洁n若服务和调用服务的组件在不同的应用程序中,则只能使用隐式启动7.2 本地服务n7.2.1 服务管理q停止Servicen将启动Service的Intent传递给stopService(Intent)函数即可,示例代码如下q在调用startService(Intent)函数首次启动Service后,系统会先后调用onCreate()和onStart()q再次调用startService(Intent)函数,系统则仅调用onStart(),而不再调用onCreate()q在调用stopService(Intent)函数停止Service时,系统会调用onDestroy()q无论调用过多少次startService(Intent),在调用stopService(Intent)函数时,系统仅调用onDestroy()一次1.stopService(serviceIntent);7.2 本地服务n7.2.1 服务管理q示例SimpleRandomServiceDemo以显式启动服务在应用程序中建立Servicen在工程中创建RandomService服务,该服务启动后会产生一个随机数,使用Toast显示在屏幕上n“启动Service”按钮调用startService(Intent)函数,启动RandomService服务n“停止Service”按钮调用stopService(Intent)函数,停止RandomService服务7.2 本地服务n7.2.1 服务管理qRandomService.java文件的代码如下1.package edu.hrbeu.SimpleRandomServiceDemo;2.3.import android.app.Service;4.import android.content.Intent;5.import android.os.IBinder;6.import android.widget.Toast;7.8.public class RandomService extends Service9.10.Override11.public void onCreate()12.super.onCreate();13.Toast.makeText(this,(1)调用onCreate(),14.Toast.LENGTH_LONG).show();15.16.7.2 本地服务n7.2.1 服务管理17.Override18.public void onStart(Intent intent,int startId)19.super.onStart(intent,startId);20.Toast.makeText(this,(2)调用onStart(),21.Toast.LENGTH_SHORT).show();22.23.double randomDouble=Math.random();24.String msg=随机数:+String.valueOf(randomDouble);25.Toast.makeText(this,msg,Toast.LENGTH_SHORT).show();26.27.28.Override29.public void onDestroy()30.super.onDestroy();31.Toast.makeText(this,(3)调用onDestroy(),32.Toast.LENGTH_SHORT).show();33.7.2 本地服务n7.2.1 服务管理n在onStart()函数中添加生产随机数的代码,第23行生产一个介于0和1之间的随机数n第24行代码构造供Toast显示的消息34.35.Override36.public IBinder onBind(Intent intent)37.return null;38.39.7.2 本地服务n7.2.1 服务管理qAndroidManifest.xml文件的代码如下1.2.6.7.9.10.11.12.13.7.2 本地服务n7.2.1 服务管理n在调用AndroidManifest.xml文件中,在标签下,包含一个标签和一个标签,在标签中,声明了RandomService所在的类14.15.16.17.7.2 本地服务n7.2.1 服务管理qSimpleRandomServiceDemo.java文件的代码如下1.package edu.hrbeu.SimpleRandomServiceDemo;2.3.import android.app.Activity;4.import android.content.Intent;5.import android.os.Bundle;6.import android.view.View;7.import android.widget.Button;8.9.public class SimpleRandomServiceDemo extends Activity 10.Override11.public void onCreate(Bundle savedInstanceState)12.super.onCreate(savedInstanceState);13.setContentView(R.layout.main);14.7.2 本地服务n7.2.1 服务管理n第20行和第25行分别是启动和停止Service的代码15.Button startButton=(Button)findViewById(R.id.start);16.Button stopButton=(Button)findViewById(R.id.stop);17.final Intent serviceIntent=new Intent(this,RandomService.class);18.startButton.setOnClickListener(new Button.OnClickListener()19.public void onClick(View view)20.startService(serviceIntent);21.22.);23.stopButton.setOnClickListener(new Button.OnClickListener()24.public void onClick(View view)25.stopService(serviceIntent);26.27.);28.29.7.2 本地服务n7.2.2 使用线程q任何耗时的处理过程都会降低用户界面的响应速度,甚至导致用户界面失去响应,当用户界面失去响应超过5秒钟,Android系统会允许用户强行关闭应用程序q较好的解决方法是将耗时的处理过程转移到子线程上,这样可以避免负责界面更新的主线程无法处理界面事件,从而避免用户界面长时间失去响应7.2 本地服务n7.2.2 使用线程q线程是独立的程序单元,多个线程可以并行工作q在多处理器系统中,每个中央处理器(CPU)单独运行一个线程,因此线程是并行工作的q在单处理器系统中,处理器会给每个线程一小段时间,在这个时间内线程是被执行的,然后处理器执行下一个线程,这样就产生了线程并行运行的假象q无论线程是否真的并行工作,在宏观上可以认为子线程是独立于主线程,且能与主线程并行工作的程序单元7.2 本地服务n7.2.2 使用线程q使用线程n实现Java的Runnable接口,并重载run()方法。在run()中放置代码的主体部分1.private Runnable backgroudWork=new Runnable()2.Override3.public void run()4./过程代码5.6.;7.2 本地服务n7.2.2 使用线程q使用线程n创建Thread对象,并将上面实现的Runnable对象作为参数传递给Thread对象qThread的构造函数中,第1个参数用来表示线程组q第2个参数是需要执行的Runnable对象q第3个参数是线程的名称n调用start()方法启动线程1.private Thread workThread;2.workThread=new Thread(null,backgroudWork,WorkThread);1.workThread.start();7.2 本地服务n7.2.2 使用线程q线程在run()方法返回后,线程就自动终止了;不推荐使用调用stop()方法在外部终止线程q最好的方法是通知线程自行终止,一般调用interrupt()方法通告线程准备终止,线程会释放它正在使用的资源,在完成所有的清理工作后自行关闭ninterrupt()方法并不能直接终止线程,仅是改变了线程内部的一个布尔字段,run()方法能够检测到这个布尔字段,从而知道何时应该释放资源和终止线程n在run()方法的代码,一般通过Thread.interrupted()方法查询线程是否被中断1.workThread.interrupt();7.2 本地服务n7.2.2 使用线程q下面的代码是以1秒为间隔循环检测断线程是否被中断n第4行代码使线程休眠1000毫秒n当线程在休眠过程中被中断,则会产生InterruptedExceptionn在中断的线程上调用sleep()方法,同样会产生InterruptedException1.public void run()2.while(!Thread.interrupted()3./过程代码4.Thread.sleep(1000);5.6.7.2 本地服务n7.2.2 使用线程qThread.interrupted()方法功能n判断线程是否应被中断n通过捕获InterruptedException判断线程是否应被中断,并且在捕获到InterruptedException后,安全终止线程1.public void run()2.try 3.while(true)4./过程代码5.Thread.sleep(1000);6.7.catch(InterruptedException e)8.e.printStackTrace();9.10.7.2 本地服务n7.2.2 使用线程q使用Handler更新用户界面nHandler允许将Runnable对象发送到线程的消息队列中,每个Handler对象绑定到一个单独的线程和消息队列上n当用户建立一个新的Handler对象,通过post()方法将Runnable对象从后台线程发送到GUI线程的消息队列中,当Runnable对象通过消息队列后,这个Runnable对象将被运行7.2 本地服务n7.2.2 使用线程n第1行代码建立了一个静态的Handler对象,但这个对象是私有的,因此外部代码并不能直接调用这个Handler对象1.private static Handler handler=new Handler();2.3.public static void UpdateGUI(double refreshDouble)4.handler.post(RefreshLable);5.6.private static Runnable RefreshLable=new Runnable()7.Override8.public void run()9./过程代码10.11.;7.2 本地服务n7.2.2 使用线程n第3行UpdateGUI()是公有的界面更新函数,后台线程通过调用该函数,将后台产生的数据refreshDouble传递到UpdateGUI()函数内部,然后并直接调用post()方法,将第6行的创建的Runnable对象传递给界面线程(主线程)的消息队列中n第7行到第10行代码是Runnable对象中需要重载的run()函数,一般将界面更新代码放置在run()函数中7.2 本地服务n7.2.2 使用线程q示例ThreadRandomServiceDemo使用线程持续产生随机数n点击“启动Service”后,将启动后台线程n点击“停止Service”后,将关闭后台线程n后台线程每1秒钟产生一个0到1之间的随机数,并通过Handler将产生的随机数显示在用户界面上7.2 本地服务n7.2.2 使用线程q在ThreadRandomServiceDemo示例中,RandomService.java文件是描述Service的文件,用来创建线程、产生随机数和调用界面更新函数qRandomService.java文件的完整代码如下1.package edu.hrbeu.ThreadRandomServiceDemo;2.3.import android.app.Service;4.import android.content.Intent;5.import android.os.IBinder;6.import android.widget.Toast;7.8.public class RandomService extends Service9.10.private Thread workThread;11.7.2 本地服务n7.2.2 使用线程12.Override13.public void onCreate()14.super.onCreate();15.Toast.makeText(this,(1)调用onCreate(),16.Toast.LENGTH_LONG).show();17.workThread=new Thread(null,backgroudWork,WorkThread);18.19.20.Override21.public void onStart(Intent intent,int startId)22.super.onStart(intent,startId);23.Toast.makeText(this,(2)调用onStart(),24.Toast.LENGTH_SHORT).show();25.if(!workThread.isAlive()26.workThread.start();27.28.29.7.2 本地服务n7.2.2 使用线程30.Override31.public void onDestroy()32.super.onDestroy();33.Toast.makeText(this,(3)调用onDestroy(),34.Toast.LENGTH_SHORT).show();35.workThread.interrupt();36.37.38.Override39.public IBinder onBind(Intent intent)40.return null;41.42.7.2 本地服务n7.2.2 使用线程43.private Runnable backgroudWork=new Runnable()44.Override45.public void run()46.try 47.while(!Thread.interrupted()48.double randomDouble=Math.random();49.ThreadRandomServiceDemo.UpdateGUI(randomDouble);50.Thread.sleep(1000);51.52.catch(InterruptedException e)53.e.printStackTrace();54.55.56.;57.7.2 本地服务n7.2.2 使用线程qThreadRandomServiceDemo.java文件是界面的Activity文件,封装Handler的界面更新函数就在这个文件中qThreadRandomServiceDemo.java文件的完整代码1.package edu.hrbeu.ThreadRandomServiceDemo;2.3.import android.app.Activity;4.import android.content.Intent;5.import android.os.Bundle;6.import android.os.Handler;7.import android.view.View;8.import android.widget.Button;9.import android.widget.TextView;10.7.2 本地服务n7.2.2 使用线程11.public class ThreadRandomServiceDemo extends Activity 12.13.private static Handler handler=new Handler();14.private static TextView labelView=null;15.private static double randomDouble;16.17.public static void UpdateGUI(double refreshDouble)18.randomDouble=refreshDouble;19.handler.post(RefreshLable);20.21.22.private static Runnable RefreshLable=new Runnable()23.Override24.public void run()25.labelView.setText(String.valueOf(randomDouble);26.27.;28.7.2 本地服务n7.2.2 使用线程29.Override30.public void onCreate(Bundle savedInstanceState)31.super.onCreate(savedInstanceState);32.setContentView(R.layout.main);33.labelView=(TextView)findViewById(R.id.label);34.Button startButton=(Button)findViewById(R.id.start);35.Button stopButton=(Button)findViewById(R.id.stop);36.final Intent serviceIntent=new Intent(this,RandomService.class);37.38.startButton.setOnClickListener(new Button.OnClickListener()39.public void onClick(View view)40.startService(serviceIntent);41.42.);43.7.2 本地服务n7.2.2 使用线程44.stopButton.setOnClickListener(new Button.OnClickListener()45.public void onClick(View view)46.stopService(serviceIntent);47.48.);49.50.7.2 本地服务n7.2.3 服务绑定q以绑定方式使用Service,能够获取到Service对象,不仅能够正常启动Service,而且能够调用正在运行中的Service实现的公有方法和属性q为了使Service支持绑定,需要在Service类中重载onBind()方法,并在onBind()方法中返回Service对象,示例代码如下7.2 本地服务n7.2.3 服务绑定n当Service被绑定时,系统会调用onBind()函数,通过onBind()函数的返回值,将Service对象返回给调用者1.public class MathService extends Service2.private final IBinder mBinder=new LocalBinder();3.4.public class LocalBinder extends Binder5.MathService getService()6.return MathService.this;7.8.9.10.Override11.public IBinder onBind(Intent intent)12.return mBinder;13.14.7.2 本地服务n7.2.3 服务绑定n第11行代码中可以看出,onBind()函数的返回值必须是符合IBinder接口,因此在代码的第2行声明一个接口变量mBinder,mBinder符合onBind()函数返回值的要求,因此将mBinder传递给调用者nIBinder是用于进程内部和进程间过程调用的轻量级接口,定义了与远程对象交互的抽象协议,使用时通过继承Binder的方法实现n第4行代码继承Binder,LocalBinder是继承Binder的一个内部类n第5行代码实现了getService()函数,当调用者获取到mBinder后,通过调用getService()即可获取到Service的对象7.2 本地服务n7.2.3 服务绑定q调用者通过bindService()函数绑定服务n并在第1个参数中将Intent传递给bindService()函数,声明需要启动的Servicen第3个参数Context.BIND_AUTO_CREATE表明只要绑定存在,就自动建立Service;同时也告知Android系统,这个Service的重要程度与调用者相同,除非考虑终止调用者,否则不要关闭这个Service1.final Intent serviceIntent=new Intent(this,MathService.class);2.bindService(serviceIntent,mConnection,Context.BIND_AUTO_CREATE);7.2 本地服务n7.2.3 服务绑定qbindService()函数的第2个参数是ServiceConnnectionn当绑定成功后,系统将调用ServiceConnnection的onServiceConnected()方法n而当绑定意外断开后,系统将调用ServiceConnnection中的onServiceDisconnected方法n由上可知,以绑定方式使用Service,调用者需要声明一个ServiceConnnection,并重载内部的onServiceConnected()方法和onServiceDisconnected方法7.2 本地服务n7.2.3 服务绑定n在第4行代码中,绑定成功后通过getService()获取Service对象,这样便可以调用Service中的方法和属性n第8行代码将Service对象设置为null,表示绑定意外失效,Service实例不再可用1.private ServiceConnection mConnection=new ServiceConnection()2.Override3.public void onServiceConnected(ComponentName name,IBinder service)4.mathService=(MathService.LocalBinder)service).getService();5.6.Override7.public void onServiceDisconnected(ComponentName name)8.mathService=null;9.10.;7.2 本地服务n7.2.3 服务绑定q取消绑定仅需要使用unbindService()方法,并将ServiceConnnection传递给unbindService()方法n需注意的是,unbindService()方法成功后,系统并不会调用onServiceConnected(),因为onServiceConnected()仅在意外断开绑定时才被调用unbindService(mConnection);7.2 本地服务n7.2.3 服务绑定q通过bindService()函数绑定Servcie时,onCreate()函数和onBinde()函数将先后被调用q通过unbindService()函数取消绑定Servcie时,onUnbind()函数将被调用,如果onUnbind()函数的返回true,则表示在调用者绑定新服务时,onRebind()函数将被调用q绑定方式的函数调用顺序7.2 本地服务n7.2.3 服务绑定q示例SimpleMathServiceDemo使用绑定方式使用Servicen创建了MathService服务,用来完成简单的数学运算但足以说明如何使用绑定方式调用Service实例中的公有方法7.2 本地服务n7.2.3 服务绑定n在服务绑定后,用户可以点击“加法运算”,将两个随机产生的数值传递给MathService服务,并从MathService对象中获取到加法运算的结果,然后显示在屏幕的上方n“取消绑定”按钮可以解除与MathService的绑定关系,取消绑定后,无法通过“加法运算”按钮获取加法运算结果7.2 本地服务n7.2.3 服务绑定q在SimpleMathServiceDemo示例中,MathService.java文件是描述Service的文件qMathService.java文件的完整代码如下1.package edu.hrbeu.SimpleMathServiceDemo;2.3.import android.app.Service;4.import android.content.Intent;5.import android.os.Binder;6.import android.os.IBinder;7.import android.widget.Toast;8.9.public class MathService extends Service10.7.2 本地服务n7.2.3 服务绑定11.private final IBinder mBinder=new LocalBinder();12.13.public class LocalBinder extends Binder14.MathService getService()15.return MathService.this;16.17.18.19.Override20.public IBinder onBind(Intent intent)21.Toast.makeText(this,本地绑定:MathService,22.Toast.LENGTH_SHORT).show();23.return mBinder;24.25.7.2 本地服务n7.2.3 服务绑定26.Override27.public boolean onUnbind(Intent intent)28.Toast.makeText(this,取消本地绑定:MathService,29.Toast.LENGTH_SHORT).show();30.return false;31.32.33.34.public long Add(long a,long b)35.return a+b;36.37.38.7.2 本地服务n7.2.3 服务绑定qSimpleMathServiceDemo.java文件是界面的Activity文件,绑定和取消绑定服务的代码在这个文件中qSimpleMathServiceDemo.java文件的完整代码如下1.package edu.hrbeu.SimpleMathServiceDemo;2.3.import android.app.Activity;4.import android.content.ComponentName;5.import android.content.Context;6.import android.content.Intent;7.import android.content.ServiceConnection;8.import android.os.Bundle;9.import android.os.IBinder;10.import android.view.View;11.import android.widget.Bu

    注意事项

    本文(Android程序设计基础 第7章 后台服务.ppt)为本站会员(asd****56)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开