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页
点击查看更多>>
资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,第,7,章 后台服务,本章学习目标,了解,Service,的原理和用途,掌握进程内服务的管理方法,掌握服务的隐式启动和显式启动方法,了解线程的启动、挂起和停止方法,了解跨线程的界面更新方法,掌握跨进程服务的绑定和调用方法,了解,AIDL,语言的用途和语法,7.1,Service,简介,Service,Service,是,Android,系统的后台服务组件,适用于开发无界面、长时间运行的应用功能,特点,没有用户界面,比,Activity,的优先级高,不会轻易被,Android,系统终止,即使,Service,被系统终止,在系统资源恢复后,Service,也将自动恢复运行状态,用于进程间通信(,Inter Process Communication,,,IPC,),解决两个不同,Android,应用程序进程之间的调用和通讯问题,7.1,Service,简介,Service,生命周期,Service,生命周期,包括,全生命周期,活动生命周期,onCreate(),事件回调函数,:,Service,的生命周期,开始,,完成,Service,的初始化工作,onStart(),事件回调函数,:,活动生命周期开始,但没有与之对应的“停止”函数,因此可以近似认为活动生命周期也是以,onDestroy(),标志结束,onDestroy(),事件回调函数,:,Service,的生命周期,结束,,释放,Service,所有占用的资源,7.1,Service,简介,Service,使用方法,启动方式,绑定方式,启动方式,通过调用,Context.startService(),启动,Service,,通过调用,Context.stopService(),或,Service.stopSefl(),停止,Service,Service,是由其他的组件启动的,但停止过程可以通过其他组件或自身完成,如果仅以启动方式使用的,Service,,这个,Service,需要具备自管理的能力,且不需要通过函数调用向外部组件提供数据或功能,7.1,Service,简介,绑定方式,通过服务链接(,Connection,)或直接获取,Service,中状态和数据信息,服务链接能够获取,Service,的对象,因此绑定,Service,的组件可以调用,Service,中的实现的函数,使用,Service,的组件通过,Context.bindService(),建立服务链接,通过,Context.unbindService(),停止服务链接,如果在绑定过程中,Service,没有启动,,Context.bindService(),会自动启动,Service,同一个,Service,可以绑定多个服务链接,这样可以同时为多个不同的组件提供服务,7.1,Service,简介,启动方式和绑定方式的结合,这两种使用方法并不是完全独立的,,在,某些情况下可以混合使用,以,MP3,播放器为例,在后台的工作的,Service,通过,Context.startService(),启动某个特定音乐播放,但在播放过程中如果用户需要暂停音乐播放,则需要通过,Context.bindService(),获取服务链接和,Service,对象,进而通过调用,Service,的对象中的函数,暂停音乐播放过程,并保存相关信息。在这种情况下,如果调用,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;,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(),和,onDestroy(),,才,使,Service,具有实际意义,Android,系统在创建,Service,时,会自动调用,onCreate(),完成必要的初始化工作,在,Service,没有必要再存在时,系统会自动调用,onDestroy(),,释放所有占用的资源,通过,Context.startService(Intent),启动,Service,时,,onStart(),则会被系统调用,,Intent,会传递给,Service,一些重要的参数,Service,会,根据实际情况选择需要重,载上面的三个函数,7.2,本地服务,7.2.1,服务管理,第,4,行、第,8,行和第,12,行,的代码,重载,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 onDestroy() ,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,中指明,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,属性,设置,Intent,的,action,属性,可以在不声明,Service,所在类的情况下启动服务,隐式启动的代码如下,final Intent serviceIntent = new Intent();,serviceIntent.setAction(edu.hrbeu.RandomService);,7.2,本地服务,7.2.1,服务管理,启动,Service,若,Service,和调用服务的组件在同一个应用程序中,可以使用显式启动或隐式启动,显式启动更加易于使用,且代码简洁,若,服务和调用服务的组件在不同的应用程序中,则只能使用隐式启动,7.2,本地服务,7.2.1,服务管理,停止,Service,将启动,Service,的,Intent,传递给,stopService(Intent),函数即可,示例代码如下,在调用,startService(Intent),函数首次启动,Service,后,系统会先后调用,onCreate(),和,onStart(),再次调用,startService(Intent),函数,系统则仅调用,onStart(),,而不再调用,onCreate(),在调用,stopService,(,Intent,),函数停止,Service,时,系统会调用,onDestroy(),无论调用过多少次,startService(Intent),,在调用,stopService (Intent),函数时,系统仅调用,onDestroy(),一次,stopService(serviceIntent);,7.2,本地服务,7.2.1,服务管理,示例,SimpleRandomServiceDemo,以显式启动服务在应用程序中建立,Service,在工程中创建,RandomService,服务,该服务启动后会产生一个随机数,使用,Toast,显示在屏幕上,“启动,Service,”,按钮调用,startService(Intent),函数,启动,RandomService,服务,“停止,Service,”,按钮调用,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 extends 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.makeText(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. 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(Intent intent) ,37. return null;,38. ,39. ,7.2,本地服务,7.2.1,服务管理,AndroidManifest.xml,文件的代码如下,7.2,本地服务,7.2.1,服务管理,在调用,AndroidManifest.xml,文件中,在,标签下,包含一个,标签和一个,标签,在,标签中,声明了,RandomService,所在的类,14.,15.,16. ,17. ,7.2,本地服务,7.2.1,服务管理,SimpleRandomServiceDemo.java,文件的代码如下,package edu.hrbeu.SimpleRandomServiceDemo,;,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(savedInstanceState);,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, 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,本地服务,7.2.2,使用线程,任何耗时的处理过程都会降低用户界面的响应速度,甚至导致用户界面失去响应,,,当用户界面失去响应超过,5,秒钟,,Android,系统会允许用户强行关闭应用程序,较好的解决方法是将耗时的处理过程转移到子线程上,这样可以避免负责界面更新的主线程无法处理界面事件,从而避免用户界面长时间失去响应,7.2,本地服务,7.2.2,使用线程,线程是独立的程序单元,多个线程可以并行工作,在多处理器系统中,每个中央处理器(,CPU,)单独运行一个线程,因此线程是并行工作的,在单处理器系统中,处理器会给每个线程一小段时间,在这个时间内线程是被执行的,然后处理器执行下一个线程,这样就产生了线程并行运行的假象,无论线程是否真的并行工作,在宏观上可以认为子线程是独立于主线程,且能与主线程并行工作的程序单元,7.2,本地服务,7.2.2,使用线程,使用线程,实现,Java,的,Runnable,接口,并重载,run(),方法。在,run(),中放置代码的主体部分,private Runnable backgroudWork = new Runnable(),Override,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);,workThread.start();,7.2,本地服务,7.2.2,使用线程,线程在,run(),方法返回后,线程就自动终止了,;,不推荐使用调用,stop(),方法在外部终止线程,最好的方法是通知线程自行终止,一般调用,interrupt(),方法通告线程准备终止,线程会释放它正在使用的资源,在完成所有的清理工作后自行关闭,interrupt(),方法并不能直接终止线程,仅是改变了线程内部的一个布尔字段,,run(),方法能够检测到这个布尔字段,从而知道何时应该释放资源和终止线程,在,run(),方法的代码,一般通过,Thread.interrupted(),方法查询线程是否被中断,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,使用线程,Thread.interrupted(),方法,功能,判断线程是否应被中断,通过捕获,InterruptedException,判断线程是否应被中断,并且在捕获到,InterruptedException,后,安全终止线程,public void run() ,try ,while(true),/,过程代码,Thread.sleep(1000);, catch (InterruptedException e) ,e.printStackTrace();,7.2,本地服务,7.2.2,使用线程,使用,Handler,更新用户界面,Handler,允许将,Runnable,对象发送到线程的消息队列中,每个,Handler,对象绑定到一个单独的线程和消息队列上,当用户建立一个新的,Handler,对象,通过,post(),方法将,Runnable,对象从后台线程发送到,GUI,线程的消息队列中,当,Runnable,对象通过消息队列后,这个,Runnable,对象将被运行,7.2,本地服务,7.2.2,使用线程,第,1,行,代码,建立了一个静态的,Handler,对象,但这个对象是私有的,因此外部代码并不能直接调用这个,Handler,对象,private static Handler handler = new 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,传递到,UpdateGUI(),函数内部,然后并直接调用,post(),方法,将第,6,行的创建的,Runnable,对象传递给界面线程(主线程)的消息队列中,第,7,行到第,10,行代码是,Runnable,对象中需要重载的,run(),函数,一般将界面更新代码放置在,run(),函数中,7.2,本地服务,7.2.2,使用线程,示例,ThreadRandomServiceDemo,使用线程持续产生随机数,点击“启动,Service,”,后,将启动后台线程,点击“停止,Service,”,后,将关闭后台线程,后台线程每,1,秒钟产生一个,0,到,1,之间的随机数,并通过,Handler,将产生的随机数显示在用户界面上,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 android.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. workThread = 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. if (!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. workThread.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. 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,本地服务,7.2.2,使用线程,ThreadRandomServiceDemo.java,文件是界面的,Activity,文件,封装,Handler,的界面更新函数就在这个文件中,ThreadRandomServiceDemo.java,文件的完整代码,package edu.hrbeu.ThreadRandomServiceDemo,;,import android.app.Activity;,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. 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. ,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 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,本地服务,7.2.2,使用线程,44.,stopButton.setOnClickListener(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,实现的公有方法和属性,为了使,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 LocalBinder 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,传递给调用者,IBinder,是用于进程内部和进程间过程调用的轻量级接口,定义了与远程对象交互的抽象协议,使用时通过继承,Binder,的方法实现,第,4,行代码继承,Binder,,,LocalBinder,是继承,Binder,的一个内部类,第,5,行代码实现了,getService(),函数,当调用者获取到,mBinder,后,通过调用,getService(),即可获取到,Service,的对象,7.2,本地服务,7.2.3,服务绑定,调用者通过,bindService(),函数绑定服务,并在第,1,个参数中将,Intent,传递给,bindService(),函数,声明需要启动的,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,服务绑定,bindService(),函数的第,2,个参数是,ServiceConnnection,当绑定成功后,系统将调用,ServiceConnnection,的,onServiceConnected(),方法,而当绑定意外断开后,系统将调用,ServiceConnnection,中的,onServiceDisconnected,方法,由上可知,,以绑定方式使用,Service,,调用者需要声明一个,ServiceConnnection,,并重载内部的,onServiceConnected(),方法和,onServiceDisconnected,方法,7.2,本地服务,7.2.3,服务绑定,在第,4,行代码中,绑定成功后通过,getService(),获取,Service,对象,这样便可以调用,Service,中的方法和属性,第,8,行代码将,Service,对象设置为,null,,表示绑定意外失效,,Service,实例不再可用,private ServiceConnection mConnection = new ServiceConnection() ,Override,public void onServiceConnected(ComponentName name, IBinder service) ,mathService = (MathService.LocalBinder)service).getService();,Override,public void onServiceDisconnected(ComponentName name) ,mathService = null;,;,7.2,本地服务,7.2.3,服务绑定,取消绑定仅需要使用,unbindService(),方法,并将,ServiceConnnection,传递给,unbindService(),方法,需,注意的是,,unbindService(),方法成功后,系统并不会调用,onServiceConnected(),,因为,onServiceConnected(),仅在意外断开绑定时才被调用,unbindService(mConnection);,7.2,本地服务,7.2.3,服务绑定,通过,bindService(),函数绑定,Servcie,时,,onCreate(),函数和,onBinde(),函数将先后被调用,通过,unbindService(),函数取消绑定,Servcie,时,,onUnbind(),函数将被调用,如果,onUnbind(),函数的返回,true,,则表示在调用者绑定新服务时,,onRebind(),函数将被调用,绑定方式的函数调用顺序,7.2,本地服务,7.2.3,服务绑定,示例,SimpleMathServiceDemo,使用绑定方式使用,Service,创建了,MathService,服务,用来完成简单的数学运算但足以说明如何使用绑定方式调用,Service,实例中的公有方法,7.2,本地服务,7.2.3,服务绑定,在服务绑定后,用户可以点击“加法运算”,将两个随机产生的数值传递给,MathService,服务,并从,MathService,对象中获取到加法运算的结果,然后显示在屏幕的上方,“取消绑定”按钮可以解除与,MathService,的绑定关系,取消绑定后,无法通过“加法运算”按钮获取加法运算结果,7.2,本地服务,7.2.3,服务绑定,在,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 class 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) ,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).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,文件的完整代码如下,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.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. 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)findViewById(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 onClick(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. isBound = true;,35. ,36. ,);,39. . unbindButton.setOnClickListener(new View.OnClickListener(),40.Override,41. public void onClick(View v) ,42. if(isBound),43. isBound = false;,44. 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 (mathService = 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
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 机械制造 > 工业自动化


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

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


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