四大组件——service

    参考作者:丿黑色丶幽默丨灬

    参考链接:http://www.cnblogs.com/pepcod/archive/2013/02/11/2937403.html

    service可以在和多场合的应用中使用,比如播放多媒体的时候用户启动了其他Activity这个时候程序要在后台继续播放,比如检测SD卡上文件的变化,再或者在后台记录你地理信息位置的改变等等,总之服务嘛,总是藏在后头的。

  Service是在一段不定的时间运行在后台,不和用户交互应用组件。每个Service必须在manifest中 通过<service>来声明。可以通过contect.startservice和contect.bindserverice来启动。
  Service和其他的应用组件一样,运行在进程的主线程中。这就是说如果service需要很多耗时或者阻塞的操作,需要在其子线程中实现。

  service的两种模式(startService()/bindService()不是完全分离的)

本地服务 Local Service 用于应用程序内部。

  它可以启动并运行,直至有人停止了它或它自己停止。在这种方式下,它以调用Context.startService()启动,而以调用Context.stopService()结束。它可以调用Service.stopSelf() 或 Service.stopSelfResult()来自己停止。不论调用了多少次startService()方法,你只需要调用一次stopService()来停止服务。

  用于实现应用程序自己的一些耗时任务,比如查询升级信息,并不占用应用程序比如Activity所属线程,而是单开线程后台执行,这样用户体验比较好。
  远程服务 Remote Service 用于android系统内部的应用程序之间。

  它可以通过自己定义并暴露出来的接口进行程序操作。客户端建立一个到服务对象的连接,并通过那个连接来调用服务。连接以调用Context.bindService()方法建立,以调用 Context.unbindService()关闭。多个客户端可以绑定至同一个服务。如果服务此时还没有加载,bindService()会先加载它。

  可被其他应用程序复用,比如天气预报服务,其他应用程序不需要再写这样的服务,调用已有的即可。
               介绍完毕,以上为搬砖内容,下面总结个人使用例子:

            一.先看生命周期

    a>  使用context.startService() 启动Service是会会经历:
  context.startService() ->onCreate()- >onStart()/onStartCommand()->Service running
  context.stopService() | ->onDestroy() ->Service stop
  如果Service还没有运行,则android先调用onCreate()然后调用onStart();如果Service已经运行,则只调用onStart(),所以一个Service的onStart方法可能会重复调用多次。

     关于onStrat()谷歌已不赞成使用,我在测试过程中都是使用onStartCommand()。这个方法也是会多次调用的,即根据startService()每次调用都会执行。另外,在服务非正常结束(异常)时,该方法会调用,并根据设置的return 的值(START_NOT_STICKY,START_STICKY,START_REDELIVER_INTENT)来判断是否再次激活该服务。

    b>  使用使用context.bindService()启动Service会经历:
  context.bindService()->onCreate()->onBind()->Service running
  onUnbind() -> onDestroy() ->Service stop

onBind将返回给客户端一个IBind接口实例,IBind允许客户端回调服务的方法,比如得到Service运行的

状态或其他操作。这个时候把调用者(Context,例如Activity)会和Service绑定在一起,Context退出了,Srevice

就会调用onUnbind->onDestroy相应退出。
  所以调用bindService的生命周期为:onCreate --> onBind(只一次,不可多次绑定) --> onUnbind --> 

onDestory。
  在Service每一次的开启关闭过程中,只有onStart可被多次调用(通过多次startService调用),其他onCreate,

onBind,onUnbind,onDestory在一个生命周期中只能被调用一次。

     

       二.启动service

       startService:

public class TestService extends Service{

	private String tag="life";
	@Override
	public void onCreate() {
		super.onCreate();
		Log.d(tag, "S----onCreate");
		playMusic();
	}

	private void playMusic() {
		Log.d(tag, "开始播放音乐");
	}

	@Override
	public void onDestroy() {
		super.onDestroy();
		Log.d(tag, "S----onDestroy");
	}
	
	@Override
	@Deprecated
	public void onStart(Intent intent, int startId) {
		super.onStart(intent, startId);
		Log.d(tag, "------onStart()");
	}
	@Override
	public int onStartCommand(Intent intent, int flags, int startId) {
	     Log.i(tag, "Received start id " + startId + ": " + intent);
	        // We want this service to continue running until it is explicitly
	        // stopped, so return sticky.
	        return START_STICKY;
	}
}

  activity中只需调用以下方式管理即可:

    

         private void doStratService() {
		 startService(new Intent(MainActivity.this,
                   TestService.class));//开启服务		
	}

	private void doStopService() {
		 stopService(new Intent(MainActivity.this,
                  TestService.class));//关闭服务
	}

bindservice:

public class TestService extends Service{

	private String tag="life";
	@Override
	public void onCreate() {
		super.onCreate();
		Log.d(tag, "S----onCreate");
		playMusic();
	}

	private void playMusic() {
		Log.d(tag, "开始播放音乐");
	}

	@Override
	public void onDestroy() {
		super.onDestroy();
		Log.d(tag, "S----onDestroy");
	}
	@Override
	public IBinder onBind(Intent intent) {
		return myBinder;
	}
    private MyBinder myBinder=new MyBinder();
	public class MyBinder extends Binder{
		public TestService getServices()
		{   
			return TestService.this;
		}
		
		public void getself(){
			TestService.this.fromSelf();
		}
	}
	public void fromA(){
		Log.d(tag, "activity使用this");
	}
	public void fromSelf(){
		Log.d(tag, "service使用this");
	}
}
    与start不同的是首先service中要实现onBinder()方法,返回IBinder实例供bind该服务的activity调用

    activity中:

    首先实现ServiceConnection接口用来绑定service

     private TestService services;
	private IBinder binder;
	private boolean isBond;
	private ServiceConnection connection=new ServiceConnection() {
		
		@Override
		public void onServiceDisconnected(ComponentName name) {
			services=null;
			binder=null;
			Toast.makeText(MainActivity.this, "解除绑定了", 0).show();
		}
		
		@Override
		public void onServiceConnected(ComponentName name, IBinder service) {
			services=((TestService.MyBinder)service).getServices();
			binder=service;
			Toast.makeText(MainActivity.this, "绑定了", 0).show();
		}
	};

接下来就是绑定和解绑:

	protected void doUnbindService() {
		if(isBond){
			unbindService(connection);
		}//解除绑定
	}
        //绑定<br style="color: rgb(75, 75, 75); line-height: 19.5px;" /><span style="color: rgb(75, 75, 75); line-height: 19.5px;"><span style="white-space:pre">	</span>//</span><span style="color: rgb(75, 75, 75); line-height: 19.5px;">第3个参数Context.BIND_AUTO_CREATE表明只要绑定存在,就自动建立 </span><span style="color: rgb(75, 75, 75); line-height: 19.5px;"><span style="white-space:pre">
</span>         //Service;同时也告知Android系统,这个Service的重要程度与调用者相同, </span><br style="color: rgb(75, 75, 75); line-height: 19.5px;" /><span style="color: rgb(75, 75, 75); line-height: 19.5px;">         //除非考虑终止调用者,否则不要关闭这个Service</span>
	private void doBindService() {
		bindService(new Intent(this, TestService.class), connection, this.BIND_AUTO_CREATE);
		 isBond=true;
	}


如果需要和服务交互,只需要在MyBinder定义好方法调用即可,例如

 

<span style="font-family:KaiTi_GB2312;font-size:18px;">((TestService.MyBinder)binder).getself();</span>




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值