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

上传人:dfg****19 文档编号:253003528 上传时间:2024-11-27 格式:PPT 页数:116 大小:1.58MB
收藏 版权申诉 举报 下载
Android程序设计基础 第7章 后台服务_第1页
第1页 / 共116页
Android程序设计基础 第7章 后台服务_第2页
第2页 / 共116页
Android程序设计基础 第7章 后台服务_第3页
第3页 / 共116页
资源描述:

《Android程序设计基础 第7章 后台服务》由会员分享,可在线阅读,更多相关《Android程序设计基础 第7章 后台服务(116页珍藏版)》请在装配图网上搜索。

1、单击此处编辑母版标题样式,,单击此处编辑母版文本样式,,第二级,,第三级,,第四级,,第五级,,,,*,,,第,7,章 后台服务,,,,本章学习目标,了解,Service,的原理和用途,,掌握进程内服务的管理方法,,掌握服务的隐式启动和显式启动方法,,了解线程的启动、挂起和停止方法,,了解跨线程的界面更新方法,,掌握跨进程服务的绑定和调用方法,,了解,AIDL,语言的用途和语法,,,7.1,,Service,简介,Service,,Service,是,Android,系统的后台服务组件,适用于开发无界面、长时间运行的应用功能,,,特点,,没有用户界面,,比,Activity,的优先级高,不会

2、轻易被,Android,系统终止,,即使,Service,被系统终止,在系统资源恢复后,Service,也将自动恢复运行状态,,用于进程间通信(,Inter Process Communication,,,IPC,),解决两个不同,Android,应用程序进程之间的调用和通讯问题,7.1,,Service,简介,Service,生命周期,,Service,生命周期,包括,,全生命周期,,活动生命周期,,onCreate(),事件回调函数,:,,Service,的生命周期,开始,,完成,Service,的初始化工作,,onStart(),事件回调函数,:,活动生命周期开始,但没有与之对应的“停止

3、”函数,因此可以近似认为活动生命周期也是以,onDestroy(),标志结束,,onDestroy(),事件回调函数,:,,Service,的生命周期,结束,,释放,Service,所有占用的资源,,,7.1,,Service,简介,Service,使用方法,,启动方式,,绑定方式,,启动方式,,通过调用,Context.startService(),启动,Service,,通过调用,Context.stopService(),或,Service.stopSefl(),停止,Service,,Service,是由其他的组件启动的,但停止过程可以通过其他组件或自身完成,,如果仅以启动方式使用的,

4、Service,,这个,Service,需要具备自管理的能力,且不需要通过函数调用向外部组件提供数据或功能,7.1,,Service,简介,绑定方式,,通过服务链接(,Connection,)或直接获取,Service,中状态和数据信息,,服务链接能够获取,Service,的对象,因此绑定,Service,的组件可以调用,Service,中的实现的函数,,使用,Service,的组件通过,Context.bindService(),建立服务链接,通过,Context.unbindService(),停止服务链接,,如果在绑定过程中,Service,没有启动,,Context.bindServi

5、ce(),会自动启动,Service,,同一个,Service,可以绑定多个服务链接,这样可以同时为多个不同的组件提供服务,7.1,,Service,简介,启动方式和绑定方式的结合,,这两种使用方法并不是完全独立的,,在,某些情况下可以混合使用,,以,MP3,播放器为例,在后台的工作的,Service,通过,Context.startService(),启动某个特定音乐播放,但在播放过程中如果用户需要暂停音乐播放,则需要通过,Context.bindService(),获取服务链接和,Service,对象,进而通过调用,Service,的对象中的函数,暂停音乐播放过程,并保存相关信息。在这种情

6、况下,如果调用,Context.stopService(),并不能够停止,Service,,需要在所有的服务链接关闭后,,Service,才能够真正的停止,,7.2,本地服务,7.2.1,服务管理,,服务管理主要指服务的启动和停止,,首先介绍,实现,Service,的最小代码集,,,,,,,,第,1,行到第,3,行引入必要包,,第,5,行声明了,RandomService,继承,android.app.Service,类,,在第,7,行到第,9,行重载了,onBind(),函数,import android.app.Service;,,import android.content.Intent

7、;,,import android.os.IBinder,;,,,,public class RandomService extends Service{,,@Override,,public IBinder onBind(Intent intent) {,,return null;,,},,},7.2,本地服务,7.2.1,服务管理,,onBind(),函数是在,Service,被绑定后调用的函数,能够返回,Service,的对象,在后面的内容中会详细介绍,,Service,的最小代码集并不能完成任何实际的功能,,,需要重载,onCreate(),、,onStart(),和,onDestro

8、y(),,才,使,Service,具有实际意义,,Android,系统在创建,Service,时,会自动调用,onCreate(),,完成必要的初始化工作,,在,Service,没有必要再存在时,系统会自动调用,onDestroy(),,释放所有占用的资源,,通过,Context.startService(Intent),启动,Service,时,,onStart(),则会被系统调用,,Intent,会传递给,Service,一些重要的参数,,Service,会,根据实际情况选择需要重,载上面的三个函数,7.2,本地服务,7.2.1,服务管理,,,,,,,,,,,第,4,行、第,8,行和第,1

9、2,行,的代码,重载,onCreate(),、,onStart(),和,onDestroy(),三个函数时,必,须,要在代码中调用父函数,public class RandomService extends Service{,,@Override,,public void onCreate() {,,super.onCreate();,,},,@Override,,public void onStart(Intent intent, int startId) {,,super.onStart(intent, startId);,,},,@Override,,public void onDest

10、roy() {,,super.onDestroy();,,},,},7.2,本地服务,7.2.1,服务管理,,注册,Service,,在,AndroidManifest.xml,文件中注册,,否则,,这个,Service,根本无法启动,,AndroidManifest.xml,文件中注册,Service,的代码如下,,,,使用,,标签声明服务,其中的,android:name,表示的是,Service,的类名称,一定要与用户建立的,Service,类名称一致,,,7.2,本地服务,7.2.1,服务管理,,启动,Service,,启动方式,,显示启动,,隐式启动,,显示启动:,在,Intent,

11、中指明,Service,所在的类,并调用,startService(Intent),函数启动,Service,,示例代码如下,,,,在,Intent,中指明启动的,Service,在,RandomSerevice.class,中,final Intent serviceIntent = new Intent(this, RandomService.class);,,startService(serviceIntent,);,7.2,本地服务,7.2.1,服务管理,,启动,Service,,隐式启动:,在注册,Service,时,声明,Intent-filter,的,action,属性,,,,,

12、设置,Intent,的,action,属性,可以在不声明,Service,所在类的情况下启动服务,,隐式启动的代码如下,,,,,,,,,,,,final Intent serviceIntent = new Intent();,,serviceIntent.setAction("edu.hrbeu.RandomService");,7.2,本地服务,7.2.1,服务管理,,启动,Service,,若,Service,和调用服务的组件在同一个应用程序中,可以使用显式启动或隐式启动,显式启动更加易于使用,且代码简洁,,若,服务和调用服务的组件在不同的应用程序中,则只能使用隐式启动,,,,7.2,本

13、地服务,7.2.1,服务管理,,停止,Service,,将启动,Service,的,Intent,传递给,stopService(Intent),函数即可,示例代码如下,,,在调用,startService(Intent),函数首次启动,Service,后,系统会先后调用,onCreate(),和,onStart(),,再次调用,startService(Intent),函数,系统则仅调用,onStart(),,而不再调用,onCreate(),,在调用,stopService,(,Intent,),函数停止,Service,时,系统会调用,onDestroy(),,无论调用过多少次,star

14、tService(Intent),,在调用,stopService (Intent),函数时,系统仅调用,onDestroy(),一次,,stopService(serviceIntent);,7.2,本地服务,7.2.1,服务管理,,示例,SimpleRandomServiceDemo,以显式启动服务在应用程序中建立,Service,,在工程中创建,RandomService,服务,该服务启动后会产生一个随机数,使用,Toast,显示在屏幕上,,“启动,Service,”,按钮调用,startService(Intent),函数,启动,RandomService,服务,,“停止,Servic

15、e,”,按钮调用,stopService(Intent),函数,停止,RandomService,服务,7.2,本地服务,7.2.1,服务管理,,RandomService.java,文件的代码如下,,package edu.hrbeu.SimpleRandomServiceDemo,;,,,,import android.app.Service;,,import android.content.Intent;,,import android.os.IBinder;,,import android.widget.Toast,;,,,,public class RandomService ext

16、ends Service{,,,,@Override,,public void onCreate() {,,super.onCreate();,,Toast.makeText(this, "(1),调用,onCreate()",,,Toast.LENGTH_LONG).show();,,},,,7.2,本地服务,7.2.1,服务管理,,,17. @Override,,18. public void onStart(Intent intent, int startId) {,,19. super.onStart(intent, startId);,,20. Toast.mak

17、eText(this, "(2),调用,onStart()",,,Toast.LENGTH_SHORT).show();,,,,23. double randomDouble = Math.random();,,24. String msg = ",随机数:,"+ String.valueOf(randomDouble);,,25. Toast.makeText(this,msg, Toast.LENGTH_SHORT).show();,,26. },,27.,,28. @Override,,29. public void onDestroy() {,,30.

18、 super.onDestroy();,,31. Toast.makeText(this, "(3),调用,onDestroy()",,,32. Toast.LENGTH_SHORT).show();,,33. },7.2,本地服务,7.2.1,服务管理,,,,,,在,onStart(),函数中添加生产随机数的代码,第,23,行生产一个介于,0,和,1,之间的随机数,,第,24,行,代码,构造供,Toast,显示的消息,,,,,34.,,35. @Override,,36. public IBinder onBind(Inten

19、t intent) {,,37. return null;,,38. },,39. },7.2,本地服务,7.2.1,服务管理,,AndroidManifest.xml,文件的代码如下,,,,,,,,,,,,,,,,,7.2

20、,本地服务,7.2.1,服务管理,,,,,在调用,AndroidManifest.xml,文件中,在,,标签下,包含一个,,标签和一个,,标签,在,,标签中,声明了,RandomService,所在的类,,,14.,,,15.,,,,16. <,uses-sdk android:minSdkVersion="3" />,,17. ,7.2,本地服务,7.2.1,服务管理,,SimpleRandomServiceDemo.java,文件的代码如下,,package edu.hrbeu.SimpleRandomServi

21、ceDemo,;,,,,import android.app.Activity;,,import android.content.Intent;,,import android.os.Bundle;,,import android.view.View;,,import android.widget.Button,;,,,,public class SimpleRandomServiceDemo extends Activity {,,@Override,,public void onCreate(Bundle savedInstanceState) {,,super.onCreate(save

22、dInstanceState);,,setContentView(R.layout.main,);,,,7.2,本地服务,7.2.1,服务管理,,,,,,,,,,,,第,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, RandomS

23、ervice.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.

24、 stopService(serviceIntent);,,26. },,27. });,,28. },,29. },7.2,本地服务,7.2.2,使用线程,,任何耗时的处理过程都会降低用户界面的响应速度,甚至导致用户界面失去响应,,,当用户界面失去响应超过,5,秒钟,,Android,系统会允许用户强行关闭应用程序,,,,,,,较好的解决方法是将耗时的处理过程转移到子线程上,这样可以避免负责界面更新的主线程无法处理界面事件,从而避免用户界面长时间失去响应,7.2,本地服务,7.2.2,使用线程,,线程是独立的程序单元,多个线程可以并行工作,,在多处理器系统中,

25、每个中央处理器(,CPU,)单独运行一个线程,因此线程是并行工作的,,在单处理器系统中,处理器会给每个线程一小段时间,在这个时间内线程是被执行的,然后处理器执行下一个线程,这样就产生了线程并行运行的假象,,无论线程是否真的并行工作,在宏观上可以认为子线程是独立于主线程,且能与主线程并行工作的程序单元,,7.2,本地服务,7.2.2,使用线程,,使用线程,,实现,Java,的,Runnable,接口,并重载,run(),方法。在,run(),中放置代码的主体部分,,,,,,,,,private Runnable backgroudWork = new Runnable(){,,@Override

26、,,public void run() {,,//,过程代码,,,},,};,7.2,本地服务,7.2.2,使用线程,,使用线程,,创建,Thread,对象,并将上面实现的,Runnable,对象作为参数传递给,Thread,对象,,,,Thread,的构造函数中,第,1,个参数用来表示线程组,,第,2,个参数是需要执行的,Runnable,对象,,第,3,个参数是线程的名称,,调用,start(),方法启动线程,,private Thread workThread;,,workThread = new Thread(null,backgroudWork,"WorkThread");,work

27、Thread.start();,7.2,本地服务,7.2.2,使用线程,,线程在,run(),方法返回后,线程就自动终止了,;,不推荐使用调用,stop(),方法在外部终止线程,,最好的方法是通知线程自行终止,一般调用,interrupt(),方法通告线程准备终止,线程会释放它正在使用的资源,在完成所有的清理工作后自行关闭,,,interrupt(),方法并不能直接终止线程,仅是改变了线程内部的一个布尔字段,,run(),方法能够检测到这个布尔字段,从而知道何时应该释放资源和终止线程,,在,run(),方法的代码,一般通过,Thread.interrupted(),方法查询线程是否被中断,,,

28、workThread.interrupt();,7.2,本地服务,7.2.2,使用线程,,下面的代码,是,以,1,秒为间隔循环检测断线程是否被中断,,,,,,,第,4,行代码使线程休眠,1000,毫秒,,当线程在休眠过程中被中断,则会产生,InterruptedException,,在中断的线程上调用,sleep(),方法,同样会产生,InterruptedException,public void run() {,,while(!Thread.interrupted()){,,//,过程代码,,,Thread.sleep(1000);,,},,},7.2,本地服务,7.2.2,使用线程,,T

29、hread.interrupted(),方法,功能,,判断线程是否应被中断,,通过捕获,InterruptedException,判断线程是否应被中断,并且在捕获到,InterruptedException,后,安全终止线程,,public void run() {,,try {,,while(true){,,//,过程代码,,,Thread.sleep(1000);,,},,} catch (InterruptedException e) {,,e.printStackTrace();,,},,},7.2,本地服务,7.2.2,使用线程,,使用,Handler,更新用户界面,,Handler

30、,允许将,Runnable,对象发送到线程的消息队列中,每个,Handler,对象绑定到一个单独的线程和消息队列上,,当用户建立一个新的,Handler,对象,通过,post(),方法将,Runnable,对象从后台线程发送到,GUI,线程的消息队列中,当,Runnable,对象通过消息队列后,这个,Runnable,对象将被运行,,,7.2,本地服务,7.2.2,使用线程,,,,,,,,,第,1,行,代码,建立了一个静态的,Handler,对象,但这个对象是私有的,因此外部代码并不能直接调用这个,Handler,对象,,private static Handler handler = new

31、 Handler,();,,,,public static void UpdateGUI(double refreshDouble){,,handler.post(RefreshLable);,,},,private static Runnable RefreshLable = new Runnable(){,,@Override,,public void run() {,,//,过程代码,,,},,};,7.2,本地服务,7.2.2,使用线程,,第,3,行,UpdateGUI(),是公有的界面更新函数,后台线程通过调用该函数,将后台产生的数据,refreshDouble,传递到,Update

32、GUI(),函数内部,然后并直接调用,post(),方法,将第,6,行的创建的,Runnable,对象传递给界面线程(主线程)的消息队列中,,第,7,行到第,10,行代码是,Runnable,对象中需要重载的,run(),函数,一般将界面更新代码放置在,run(),函数中,,7.2,本地服务,7.2.2,使用线程,,示例,ThreadRandomServiceDemo,使用线程持续产生随机数,,点击“启动,Service,”,后,将启动后台线程,,点击“停止,Service,”,后,将关闭后台线程,,后台线程每,1,秒钟产生一个,0,到,1,之间的随机数,并通过,Handler,将产生的随机数

33、显示在用户界面上,7.2,本地服务,7.2.2,使用线程,,在,ThreadRandomServiceDemo,示例中,,RandomService.java,文件是描述,Service,的文件,用来创建线程、产生随机数和调用界面更新函数,,RandomService.java,文件的完整代码如下,,package edu.hrbeu.ThreadRandomServiceDemo,;,,,,import android.app.Service;,,import android.content.Intent;,,import android.os.IBinder;,,import androi

34、d.widget.Toast,;,,,,public class RandomService extends Service{,,,,private Thread workThread;,,,7.2,本地服务,7.2.2,使用线程,,,12.,,@Override,,13. public void onCreate() {,,14. super.onCreate();,,15. Toast.makeText(this, "(1),调用,onCreate()",,,16. Toast.LENGTH_LONG).show();,,17. wo

35、rkThread = new Thread(null,backgroudWork,"WorkThread");,,18. },,19.,,20. @Override,,21. public void onStart(Intent intent, int startId) {,,22. super.onStart(intent, startId);,,23. Toast.makeText(this, "(2),调用,onStart()",,,24. Toast.LENGTH_SHORT).show();,,25. i

36、f (!workThread.isAlive()){,,26. workThread.start();,,27. },,28. },,29.,7.2,本地服务,7.2.2,使用线程,,,30.,,@Override,,31. public void onDestroy() {,,32. super.onDestroy();,,33. Toast.makeText(this, "(3),调用,onDestroy()",,,34. Toast.LENGTH_SHORT).show();,,35. w

37、orkThread.interrupt();,,36. },,37.,,38. @Override,,39. public IBinder onBind(Intent intent) {,,40. return null;,,41. },,42.,7.2,本地服务,7.2.2,使用线程,,,43.,,private Runnable backgroudWork = new Runnable(){,,44. @Override,,45. public void run() {,,46. try {,,47.

38、 while(!Thread.interrupted()){,,48. double randomDouble = Math.random();,,49. ThreadRandomServiceDemo.UpdateGUI(randomDouble);,,50. Thread.sleep(1000);,,51. },,52. } catch (InterruptedException e) {,,53. e.printStackTr

39、ace();,,54. },,55. },,56. };,,57. },7.2,本地服务,7.2.2,使用线程,,ThreadRandomServiceDemo.java,文件是界面的,Activity,文件,封装,Handler,的界面更新函数就在这个文件中,,ThreadRandomServiceDemo.java,文件的完整代码,package edu.hrbeu.ThreadRandomServiceDemo,;,,,,import android.app.Activ

40、ity;,,import android.content.Intent;,,import android.os.Bundle;,,import android.os.Handler;,,import android.view.View;,,import android.widget.Button;,,import android.widget.TextView,;,,,7.2,本地服务,7.2.2,使用线程,,,11. public class ThreadRandomServiceDemo extends Activity {,,12.,,13.

41、 private static Handler handler = new Handler();,,14. private static TextView labelView = null;,,private static double randomDouble ;,,16.,,17. public static void UpdateGUI(double refreshDouble){,,randomDouble = refreshDouble;,,19. handler.post(RefreshLable);,,20. }

42、,,21.,,22. private static Runnable RefreshLable = new Runnable(){,,23. @Override,,24. public void run() {,,25. labelView.setText(String.valueOf(randomDouble));,,26. },,27. };,,28.,7.2,本地服务,7.2.2,使用线程,,29.,,@Override,,30. public void onCreate(Bundle savedIn

43、stanceState) {,,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 s

44、erviceIntent = 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,本地服务,7.2.2,使用线程,,,44.,,stopButton.setOnClic

45、kListener(new Button.OnClickListener(){,,45. public void onClick(View view){,,46. stopService(serviceIntent);,,47. },,48. });,,49. },,50. },,7.2,本地服务,7.2.3,,服务绑定,,以绑定方式使用,Service,,能够获取到,Service,对象,不仅能够正常启动,Service,,而且能够调用正在运行中的,Service,实现的公有方法和属性,,为了使,

46、Service,支持绑定,需要在,Service,类中重载,onBind(),方法,并在,onBind(),方法中返回,Service,对象,示例代码如下,,7.2,本地服务,7.2.3,,服务绑定,,,,,,,,,,,当,Service,被绑定时,系统会调用,onBind(),函数,通过,onBind(),函数的返回值,将,Service,对象返回给调用者,public class MathService extends Service{,,private final IBinder mBinder = new LocalBinder,();,,,,public class LocalBin

47、der extends Binder{,,MathService getService() {,,return MathService.this;,,},,,},,,,@Override,,public IBinder onBind(Intent intent) {,,return mBinder;,,},,},7.2,本地服务,7.2.3,,服务绑定,,第,11,行代码中可以看出,,onBind(),函数的返回值必须是符合,IBinder,接口,因此在代码的第,2,行声明一个接口变量,mBinder,,,mBinder,符合,onBind(),函数返回值的要求,因此将,mBinder,传递给

48、调用者,,IBinder,是用于进程内部和进程间过程调用的轻量级接口,定义了与远程对象交互的抽象协议,使用时通过继承,Binder,的方法实现,,第,4,行代码继承,Binder,,,LocalBinder,是继承,Binder,的一个内部类,,第,5,行代码实现了,getService(),函数,当调用者获取到,mBinder,后,通过调用,getService(),即可获取到,Service,的对象,,7.2,本地服务,7.2.3,,服务绑定,,调用者通过,bindService(),函数绑定服务,,并在第,1,个参数中将,Intent,传递给,bindService(),函数,声明需要启

49、动的,Service,,第,3,个参数,Context.BIND_AUTO_CREATE,表明只要绑定存在,就自动建立,Service,;同时也告知,Android,系统,这个,Service,的重要程度与调用者相同,除非考虑终止调用者,否则不要关闭这个,Service,,final Intent serviceIntent = new Intent(this,MathService.class);,,bindService(serviceIntent,mConnection,Context.BIND_AUTO_CREATE);,7.2,本地服务,7.2.3,,服务绑定,,bindServic

50、e(),函数的第,2,个参数是,ServiceConnnection,,当绑定成功后,系统将调用,ServiceConnnection,的,onServiceConnected(),方法,,而当绑定意外断开后,系统将调用,ServiceConnnection,中的,onServiceDisconnected,方法,,由上可知,,以绑定方式使用,Service,,调用者需要声明一个,ServiceConnnection,,并重载内部的,onServiceConnected(),方法和,onServiceDisconnected,方法,,7.2,本地服务,7.2.3,,服务绑定,,,,,,,,,在

51、第,4,行代码中,绑定成功后通过,getService(),获取,Service,对象,这样便可以调用,Service,中的方法和属性,,第,8,行代码将,Service,对象设置为,null,,表示绑定意外失效,,Service,实例不再可用,private ServiceConnection mConnection = new ServiceConnection() {,,@Override,,public void onServiceConnected(ComponentName name, IBinder service) {,,mathService = ((MathService.

52、LocalBinder)service).getService();,,},,@Override,,public void onServiceDisconnected(ComponentName name) {,,mathService = null;,,},,};,7.2,本地服务,7.2.3,,服务绑定,,取消绑定仅需要使用,unbindService(),方法,并将,ServiceConnnection,传递给,unbindService(),方法,,需,注意的是,,unbindService(),方法成功后,系统并不会调用,onServiceConnected(),,因为,onServ

53、iceConnected(),仅在意外断开绑定时才被调用,,,unbindService(mConnection);,7.2,本地服务,7.2.3,,服务绑定,,通过,bindService(),函数绑定,Servcie,时,,,onCreate(),函数和,onBinde(),函数将先后被调用,,通过,unbindService(),函数取消绑定,Servcie,时,,onUnbind(),函数将被调用,如果,onUnbind(),函数的返回,true,,则表示在调用者绑定新服务时,,onRebind(),函数将被调用,,绑定方式的函数调用顺序,,7.2,本地服务,7.2.3,,服务绑定,,

54、示例,SimpleMathServiceDemo,使用绑定方式使用,Service,,创建了,MathService,服务,用来完成简单的数学运算但足以说明如何使用绑定方式调用,Service,实例中的公有方法,,7.2,本地服务,7.2.3,,服务绑定,,在服务绑定后,用户可以点击“加法运算”,将两个随机产生的数值传递给,MathService,服务,并从,MathService,对象中获取到加法运算的结果,然后显示在屏幕的上方,,“取消绑定”按钮可以解除与,MathService,的绑定关系,取消绑定后,无法通过“加法运算”按钮获取加法运算结果,7.2,本地服务,7.2.3,,服务绑定,,

55、在,SimpleMathServiceDemo,示例中,,MathService.java,文件是描述,Service,的文件,,MathService.java,文件的完整代码如下,,,,package edu.hrbeu.SimpleMathServiceDemo,;,,,,import android.app.Service;,,import android.content.Intent;,,import android.os.Binder;,,import android.os.IBinder;,,import android.widget.Toast,;,,,,public clas

56、s MathService extends Service,{,,,7.2,本地服务,7.2.3,,服务绑定,,private final IBinder mBinder = new LocalBinder();,,,,13. public class LocalBinder extends Binder{,,14. MathService getService() {,,15. return MathService.this;,,16. },,},,,,19. @Override,,20. public IBinder onBind(Intent intent

57、) {,,21. Toast.makeText(this, ",本地绑定:,MathService",,,22. Toast.LENGTH_SHORT).show();,,23. return mBinder;,,24. },,25.,7.2,本地服务,7.2.3,,服务绑定,,26.,,@Override,,27. public boolean onUnbind(Intent intent){,,28. Toast.makeText(this, ",取消本地绑定:,MathService",,,29. Toast.LENGTH_SHORT).

58、show();,,30. return false;,,31. },,32.,,33.,,34. public long Add(long a, long b){,,35. return a+b;,,36. },,37.,,38. },7.2,本地服务,7.2.3,,服务绑定,,SimpleMathServiceDemo.java,文件是界面的,Activity,文件,绑定和取消绑定服务的代码在这个文件中,,SimpleMathServiceDemo.java,文件的完整代码如

59、下,,package edu.hrbeu.SimpleMathServiceDemo,;,,,,import android.app.Activity;,,import android.content.ComponentName;,,import android.content.Context;,,import android.content.Intent;,,import android.content.ServiceConnection;,,import android.os.Bundle;,,import android.os.IBinder;,,import android.view.

60、View;,,import android.widget.Button;,,import android.widget.TextView,;,,,7.2,本地服务,7.2.3,,服务绑定,,14. public class SimpleMathServiceDemo extends Activity {,,15. private MathService mathService;,,16. private boolean isBound = false;,,17. TextView labelView;,,18. @Override,,19.

61、 public void onCreate(Bundle savedInstanceState) {,,20. super.onCreate(savedInstanceState);,,21. setContentView(R.layout.main);,,22.,,23. labelView = (TextView)findViewById(R.id.label);,,24. Button bindButton = (Button)findViewB

62、yId(R.id.bind);,,25. Button unbindButton = (Button)findViewById(R.id.unbind);,,26. Button computButton = (Button)findViewById(Rpute);,,27.,,28. bindButton.setOnClickListener(new View.OnClickListener(){,,29. @Override,,30. public void onClic

63、k(View v) {,,31. if(!isBound){,7.2,本地服务,7.2.3,,服务绑定,,32. final Intent serviceIntent = new,,Intent(SimpleMathServiceDemo.this,MathService.class);,,33. bindService(serviceIntent,mConnection,Context.BIND_AUTO_CREATE);,,34. i

64、sBound = true;,,35. },,36. },,});,,,,39. . unbindButton.setOnClickListener(new View.OnClickListener(){,,40. @Override,,41. public void onClick(View v) {,,42. if(isBound){,,43. isBound = false;,,44.

65、 unbindService(mConnection);,,45. mathService = null;,,46. },,47. },,48. });,7.2,本地服务,7.2.3,,服务绑定,,49.,,50. computButton.setOnClickListener(new View.OnClickListener(){,,51. @Override,,52. public void onClick(View v) {,,53. if (math

66、Service == null){,,54. labelView.setText(",未绑定服务,");,,55. return;,,56. },,57. long a = Math.round(Math.random()*100);,,58. long b = Math.round(Math.random()*100);,,59. long result = mathService.Add(a, b);,,60. String msg = String.valueOf(a)+" + "+String.valueOf(b)+,,6

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

相关资源

更多
正为您匹配相似的精品文档
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


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