第5章Android服务(Service).ppt
《第5章Android服务(Service).ppt》由会员分享,可在线阅读,更多相关《第5章Android服务(Service).ppt(47页珍藏版)》请在麦多课文档分享上搜索。
1、第5章 Android服务(Service),网络资源:http:/ Service概述,文本,5.1.1 Service介绍,Service是android 系统中的一种组件,它跟Activity的级别差不多,它们都是从Context派生出来的,但是它不能自己运行,只能在后台运行,并且可以和其它组件进行交互。它需要通过某一个Activity或者其他Context对象来调用。,5.1.2 启动Service的两种方式,在Android系统中,常采用以下两种方式启动Service.(1)通过Context的startService()启动service后,访问者与service之间没有关联,该s
2、ervice将一直在后台执行,即使调用startservice的进程结束了,service仍然还存在,直到有进程调用stopService(),或者service自己停止(stopSelf)。这种情况下,service与访问者之间无法进行通信,数据交换,往往用于执行单一操作,并且没有返回结果。例如通过网络上传,下载文件,操作一旦完成,服务应该自动销毁。(2)通过Context的bindService()绑定Service,绑定后Service就和调用bindService的组件同生共死了。也就是说当调用bindService()的组件销毁了,那么它绑定的Service也要跟着被结束,当然期间也
3、可以调用unbindservice()让Service提前结束。注意:一个服务可以与多个组件绑定,只有当所有的组件都与之解绑后,该服务才会被销毁。,5.1.2 启动Service的两种方式,以上两种方法可以混合使用,即一个Service既可以启动也可以绑定,只需要同时实现onStartedCommand()(用于启动)和onBind()(用于绑定)方法,那么只有调用stopService(),并且调用unbindService()方法后,该Service才会被销毁。 注意:服务运行在它所在进程的主线程,服务并没有创建它自己的线程,也没有运行在一个独立的进程上(单独指定的除外),这意味着,如果你
4、的服务做一些消耗CPU或者阻塞的操作,你应该在服务中创建一个新的线程去处理。通过使用独立的线程,你就会降低程序出现ANR(Application No Response程序没有响应)的风险,程序的主线程仍然可以保持与用户的交互。,5.1.3 Service中常用方法,与开发其它Android组件类似,开发Service组件需要先开发一个Service子类,该类需继承系统提供的Service类,系统中Service类包含的方法主要有: abstract IBinder onBind(Intent intent):该方法是一个抽象方法,所有Service子类必须实现该方法。该方法将返回一个IBin
5、der对象,应用程序可通过该对象与Service组件通信; void onCreate():当Service第一次被创建时,将立即回调该方法; void onDestroy():当Service被关闭之前,将回调该方法; void onStartCommand(Intent intent,int flags,int startId):每次客户端调用startService(Intent intent)方法启动该Service时都会回调onStartCommand()方法; boolean onUnbind(Intent intent):当该Service上绑定的所有客户端都断开连接时将会回调该
6、方法。,开发Service组件需要先开发一个Service子类,然后在AndroidManifest.xml文件中配置该Service,配置时可通过元素指定它可被哪些Intent启动。,在AndroidManifest.xml文件中配置Service:,Action中的值一定要与程序中创建的Intent的Action的值一致,程序就是根据Action的值来查找相应的Service从而启动它。,5.1.3 Service中常用方法,通过Context的startService()启动Service后,访问者与Service之间没有关联,该Service将一直在后台执行,即使调用startServ
7、ice()的进程结束了,Service仍然还存在,直到有进程调用stopService(),或者Service自己自杀(stopSelf())。这种情况下,Service与访问者之间无法进行通信、数据交换。,通过Context的bindService()绑定Service后,Service就和 调用bindService()的组件同生共死了,也就是说当调用 bindService()的组件销毁了,那么它绑定的Service也要跟着被结束。,5.1.2 Service中常用方法简介,案例:FirstService,定义的Service子类必须实现onBind()方法,然后还需在AndroidMa
8、nifest.xml文件中对该Service子类进行配置,配置时可通过元素指定它可被哪些Intent启动。下面具体来创建一个Service子类并对它进行配置,代码如下。,程序清单:/FirstService/src/iet/jxufe/cn/android/MyService.java,public class MyService extends Service private static final String TAG = “MyService“;public IBinder onBind(Intent arg0) Log.i(TAG, “MyService onBind invoked
9、!“);return myBinder; public void onCreate() Log.i(TAG, “MyService onCreate invoked!“);super.onCreate(); public void onDestroy() Log.i(TAG, “MyService onDestroy invoked!“);super.onDestroy();quit=true; public int onStartCommand(Intent intent, int flags, int startId) Log.i(TAG, “MyService onStartComman
10、d invoked!“);return super.onStartCommand(intent, flags, startId); ,自定义服务类,重写OnBind方法,重写OnCreate方法,重写OnDestory方法,重写OnStartCommand方法,案例:FirstService,在上述代码中,创建了自定义的MyService类,该类继承了Android.app.Service类,并重写了onBind(),onCreate(),onStartCommand(),onDestory等方法,在每个方法中,通过LOG语句测试和查看该方法是否被调用。,定义完Service之后,还需在项目的
11、AndroidManifest.xml文件中配置该Service,增加配置片段如下。,虽然目前MyService已经创建并注册了,但系统仍然不会启动MyService,要想启动这个服务。必须显示地调用startService()方法。如果想停止服务,需要显示地调用stopService()方法,下面代码中,使用Activity作为Service的启动者,分别定义了启动Service和关闭Service两个按钮,并为它们添加了事件处理。,程序清单:/FirstService/src/iet/jxufe/cn/android/MainActivity.java,public class MainA
12、ctivity extends Activity public void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);start=(Button)findViewById(R.id.start);stop=(Button)findViewById(R.id.stop);final Intent intent=new Intent();intent.setAction(“.android.MyService“);start
13、.setOnClickListener(new OnClickListener() public void onClick(View v) startService(intent); );stop.setOnClickListener(new OnClickListener() public void onClick(View v) stopService(intent); ); ,案例:FirstService,案例:FirstService,运行本节的例子后,第一次单击【启动Service】按钮后,在DDMS视图下的LogCat视图有如下图所示的输出。,然后单击【关闭Service】按钮,
14、LogCat视图有如下图所示的输出。,下面按如下的单击顺序,重新测试一下本例。【启动Service】【启动Service】【启动Service】【停止Service】测试完程序,查看LogCat控制台输出信息如下图所示。系统只在第一次单击【启动Service】按钮时调用onCreate()和onStartCommand()方法,再单击该按钮 时,系统只会调用onStartCommand()方法,而不会重复调用onCreate()方法。,5.1.4 绑定Service过程,Context的bindService()方法的完整方法签名为:bindService(Intent service,Ser
15、viceConnection conn, int flags),该方法的三个参数解释如下: service:该参数表示与服务类相关联的Intent对象,用于指定所绑定的Service应该符合哪些条件; conn:该参数是一个ServiceConnection对象,该对象用于监听访问者与Service之间的连接情况。当访问者与Service之间连接成功时,将回调该ServiceConnection对象的onServiceConnected(ComponentName name,IBinder service)方法;当访问者与Service之间断开连接时将回调该ServiceConnection对
16、象的onServiceDisconnected(ComponentName name)方法。 flags:指定绑定时是否自动创建Service(如果Service还未创建)。该参数可指定BIND_AUTO_CREATE(自动创建)。,当开发Service类时,该Service类必须提供一个onBind()方法,在绑定本地Service的情况下,onBind()方法所返回的IBinder对象将会传给ServiceConnection对象里onServiceConnected(ComponentName name,IBinder service)方法的service参数,这样访问者就可以通过IBi
17、nder对象与Service进行通信。实际开发时通常会采用继承Binder(IBinder的实现类)的方式实现自己的IBinder对象。,5.1.4 绑定Service过程,5.1.4 绑定Service案例,在上一个案例中,添加两个按钮,一个用于绑定服务,一个用于解绑,然后分别为其添加事件处理。在绑定服务时,需要传递一个ServiceConnection对象,所以先创建该对象,代码如下。,private ServiceConnection conn=new ServiceConnection() public void onServiceDisconnected(ComponentName
18、name) Log.i(TAG,“MainActivity onServiceDisconnected invoked!“); public void onServiceConnected(ComponentName name, IBinder service) Log.i(TAG,“MainActivity onServiceConnected invoked!“);myBinder=(MyBinder)service;,程序清单:/FirstService/src/iet/jxufe/cn/android/MainActivity.java,5.1.4 (绑定Service案例),然后在M
19、yService中添加两个与绑定Service相关的方法,onUnBind()和onRebind(),与其他方法类似,只是在方法体重打印出该方法被调用了信息,代码如下。,public boolean onUnbind(Intent intent) Log.i(TAG, “MyService onUnbind invoked!“);return super.onUnbind(intent);public void onRebind(Intent intent) Log.i(TAG, “MyService onRebind invoked!“);super.onRebind(intent);,程序
20、清单:/FirstService/src/iet/jxufe/cn/android/MyService.java,5.1.4 (绑定Service案例),最后在MainActivity中为绑定Service和解绑Service按钮添加事件处理,代码如下。,public class MainActivity extends Activity public void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);bind=(B
21、utton)findViewById(R.id.bind);unbind=(Button)findViewById(R.id.unbind);final Intent intent=new Intent();intent.setAction(“.android.MyService“);bind.setOnClickListener(new OnClickListener() public void onClick(View v) bindService(intent, conn,Service.BIND_AUTO_CREATE); ); unbind.setOnClickListener(ne
22、w OnClickListener() public void onClick(View v) unbindService(conn); );,程序清单:/FirstService/src/iet/jxufe/cn/android/MainActivity.java,5.1.4 (绑定Service案例),程序执行后,单击绑定Service按钮,LogCat控制台打印信息如下图所示,首先调用onCreate()方法,然后调用onBind()方法。,程序执行后,单击解绑Service按钮,LogCat控制台打印信息如下图所示,首先调用onUnbind()方法,然后调用onDestory()方法。
23、,程序运行后,单击绑定Service按钮,然后退出程序,LogCat控制台打印信息如下图。可以看出,程序退出后,Service会自动退出。,5.1.4 (绑定Service案例),当单击绑定Service按钮后,再重复多次单击绑定Service按钮,查看控制台打印信息,发现程序并不会多次调用onBind()方法。,采用绑定服务的另一个优势是组件可以与Service之间进行通信,传递数据。这主要是通过IBinder对象进行的,因此需在Service中创建一个IBinder对象,然后让其作为onBind()方法的返回值返回,对数据的操作是放在IBinder对象中的。修改我们的MyService类,
24、添加一个内部类MyBinder,同时在onCreate()方法中启动一个线程,模拟后台服务,该线程主要是做数据递增操作,在MyBinder类中,提供一个方法,可以获取当前递增的值(count的值),具体代码如下。,程序清单:/FirstService/src/iet/jxufe/cn/android/MyService.java,5.1.4 (绑定Service案例),public class MyService extends Service private static final String TAG = “MyService“;private int count=0;private b
- 1.请仔细阅读文档,确保文档完整性,对于不预览、不比对内容而直接下载带来的问题本站不予受理。
- 2.下载的文档,不会出现我们的网址水印。
- 3、该文档所得收入(下载+内容+预览)归上传者、原创作者;如果您是本文档原作者,请点此认领!既往收益都归您。
下载文档到电脑,查找使用更方便
2000 积分 0人已下载
下载 | 加入VIP,交流精品资源 |
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ANDROID 服务 SERVICE PPT
