Service的使用(2)

    服务 相当于一个没有界面 的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() .




你可能感兴趣的:(Service的使用(2))