服务 相当于一个没有界面 的Activity 。运行在后台 ,不可交互,不可以自己启动,要用别的Context 来执行startService () 或者 bindService()来绑定。
Service工作的机制 是
(1) client 成功地 bind Service
(2) Service 传递一个 IBinder 给 Client
(3) client 可以直接调用 Service 的方法与接口
一。服务的新建
服务重写 的方法有6个,已经包括 了默认的 onBind()方法。如下
@Override public IBinder onBind(Intent arg0) { // TODO Auto-generated method stub return null; }
我们注意到,onBind()方法将传递一个 IBinder 给client . IBinder 作用是负责Service 与Client 的通信 。 说明 下
Bind implements IBinder
这里的关键代码 如下
public class MyBinder extends Binder { MyService getService (){ return MyService.this; //返回一个Service } } private final IBinder binder = new MyBinder(); @Override public IBinder onBind(Intent arg0) { // TODO Auto-generated method stub Log.i(TAG,"=====>onBinder"); Toast.makeText(getBaseContext(), "onBinder", Toast.LENGTH_SHORT).show(); return binder; }
这里,我们写了一个继承Binder 的内部类。用于向Activity 中返回 Service对象 。
为了使用Service ,我们在Manifest.xml 文件中还对Service 进行注册。注意,与Activity 平级。
<service android:enabled="true" android:name=".MyService"></service>
二。启动Service
有两种方法启动
ConextWrapper.startService (Intent service ); ContextWrapper.bindService (Intent service , ServiceConnection conn ,int flags );
(1)先用方法一,这里的 Service 独立运行在后台 ,不受 Activity 的生命周期的影响 。当所有 Activity 都退出 时,Service 还是在执行,只到有Context 调用 stopService ()才停止 。
startBtn.setOnClickListener(new OnClickListener(){ @Override public void onClick(View arg0) { // TODO Auto-generated method stub Intent i = new Intent (ServiceDemo.this,MyService.class); startService(i); } }); stopBtn.setOnClickListener(new OnClickListener(){ @Override public void onClick(View arg0) { // TODO Auto-generated method stub Intent i1 = new Intent (getBaseContext(),MyService.class); stopService(i1); } });
我们点击运行后,发现运行过程 是
startBtn :onCreate( )---->onStart()
stopBtn : onDestroy()
(2)在方法二中 ,我们用bindService() 。
这种 方法里,只要 Activity 结束,Service 也结束 。使用 bindService () ,我们还要一个 ServiceConnection 对象 ,作用是实现 Activity 与 Service 的绑定。
如下:
MyService mService; ServiceConnection mConnection = new ServiceConnection (){ @Override public void onServiceConnected(ComponentName name, IBinder service) { // TODO Auto-generated method stub mService = ((MyService.MyBinder)service).getService(); //连接成功 } @Override public void onServiceDisconnected(ComponentName arg0) { // TODO Auto-generated method stub mService =null; } };
在ServiceConnection中,我们实现 了两方法。关于连接成功的。
在连接Service 的时候 ,我们会调用 onBind()方法,在方法中,我们返回了一个 IBinder对象 ,这个 对象 就是参数 service 。我们将 IBinder 类型转化 成之前 的MyBinder 内部类对象 ,再通过 这个
对象 的getService ()方法得到Service 的操作对象 。
最后代码如下 :
startBtn.setOnClickListener(new OnClickListener(){ @Override public void onClick(View arg0) { // TODO Auto-generated method stub Intent i = new Intent (ServiceDemo.this,MyService.class); bindService (i, mConnection ,Context.BIND_AUTO_CREATE); //绑定服务 } }); stopBtn.setOnClickListener(new OnClickListener(){ @Override public void onClick(View arg0) { // TODO Auto-generated method stub unbindService(mConnection); } }); }
运行过程 是:
bind: onCreate () ------>onBind()
unbind: unbindService()----->onDestroy()
事实上 在bindService() 时,Service 有一个原则,只给执行一次 onCreate() .