Service的启动有两种方式:1)Started,也就是服务的启动,服务启动后,服务移动运行下去,及时启动他的服务已经被销毁。操作完成后,此服务自动销毁。服务可以做一些阻塞线程的工作,如网络下载、上传文件等。
BoundService是指应用程序组件通过BindService()绑定到服务上。服务声明后,任何服务器组件都能绑定该服务。
一个服务的生命周期包括Start、Create、Destory三个阶段,每个阶段有着相应的回调函数,
onStartCommand()、
onBind()、
onCreate()和
onDestroy()。服务的声明需要在文件manifest中进行声明。服务的使用需要继承自service中。
<service android:name=".ExampleService" />
例如启动一个数据保存的服务,首先启动一个守护服务,通过startservice()启动服务,并且通过一个intent进行数据传递。该服务在onStartCommond()中接受intent,再进行数据库的事务处理。另外,需要注意的是启动服务的时候,需要重新的启动一个进程。因为服务都是一些耗时的操作。
绑定服务是一种应用程序和服务绑定的一种方式,它允许应用程序和服务进行绑定交互。客户端绑定服务的时候必须通过Intent和ServiceConnnection进行服务的绑定。服务绑定之后通过ServiceConnection进行服务的监控和互动。ServiceConnection链接后会调用OnServiceConnection回调函数,传入Ibind对象与服务器端进行交互。
绑定之前需要再服务器端首先准备一个支持Bind的服务,服务中必须实现Onbind方法,并且该方法必须要返回一个对象,客户端可以通过该对象调用服务的方法。该对象需要实现Ibind()接口,接口中定义服务实现的方法。
以上绑定服务用于同一进程中的操作,多线程的绑定需要通过Message和HandleMessage进行操作。Servcie中定义Handler,同时定义HandleMessage方法,该方法中处理相应的操作,onBind中返回相应的Message接口。客户端中,依然绑定服务,仍然需要传递ServiceConnection,并且通过他获取服务端的Message。另外,客户端,根据获取的Mesage,发送消息与服务器端进行操作。
例如:
public class MessengerService extends Service { /** 发送给服务的用于显示信息的指令*/ static final int MSG_SAY_HELLO = 1; /** * 从客户端接收消息的Handler */ class IncomingHandler extends Handler { @Override public void handleMessage(Message msg) { switch (msg.what) { case MSG_SAY_HELLO: Toast.makeText(getApplicationContext(), "hello!", Toast.LENGTH_SHORT).show(); break; default: super.handleMessage(msg); } } } /** * 向客户端公布的用于向IncomingHandler发送信息的Messager */ final Messenger mMessenger = new Messenger(new IncomingHandler()); /** * 当绑定到服务时,我们向Messager返回接口, * 用于向服务发送消息 */ @Override public IBinder onBind(Intent intent) { Toast.makeText(getApplicationContext(), "binding", Toast.LENGTH_SHORT).show(); return mMessenger.getBinder(); } }
public class ActivityMessenger extends Activity { /** 用于和服务通信的Messenger*/ Messenger mService = null; /** 标识我们是否已绑定服务的标志 */ boolean mBound; /** * 与服务的主接口进行交互的类 */ private ServiceConnection mConnection = new ServiceConnection() { public void onServiceConnected(ComponentName className, IBinder service) { // 与服务建立联接后将会调用本方法, // 给出用于和服务交互的对象。 // 我们将用一个Messenger来与服务进行通信, // 因此这里我们获取到一个原始IBinder对象的客户端实例。 mService = new Messenger(service); mBound = true; } public void onServiceDisconnected(ComponentName className) { // 当与服务的联接被意外中断时——也就是说服务的进程崩溃了, // 将会调用本方法。 mService = null; mBound = false; } }; public void sayHello(View v) { if (!mBound) return; // 创建并向服务发送一个消息,用到了已约定的'what'值 Message msg = Message.obtain(null, MessengerService.MSG_SAY_HELLO, 0, 0); try { mService.send(msg); } catch (RemoteException e) { e.printStackTrace(); } } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } @Override protected void onStart() { super.onStart(); // Bind to the service bindService(new Intent(this, MessengerService.class), mConnection, Context.BIND_AUTO_CREATE); } @Override protected void onStop() { super.onStop(); // Unbind from the service if (mBound) { unbindService(mConnection); mBound = false; } } }
另,onBinde(Intent,ServiceConnection,服务标识),Intent即服务的意图,也就是要启动的服务。ServiceConnection标识进行交互的对象,第三个标识指的是服务的启动方式。
另外服务是可以跨进行进行通信的,通信的方式通过AIDL和RPC协议进行通信。AIDL定义了通信的接口,RPC将通信的方式进行封装,使得程序显示的更加简洁和方便。