如果把Activity比喻为前台程序,那么Service就是后台程序,Service的整个生命周期都只会在后台执行。Service跟 Activity一样也由Intent调用。在工程里想要添加一个Service,先新建继承Service的类,然后到 AndroidManifest.xml -> Application ->Application Nodes中的Service标签中添加。

Service要由Activity通过startService 或者 bindService来启动,Intent负责传递参数。

startService与bindService都可以启动Service,那么它们之间有什么区别呢?它们两者的区别就是使Service的周期改变。由 startService启动的Service必须要有stopService来结束Service,不调用stopService则会造成 Activity结束了而Service还运行着。bindService启动的Service可以由unbindService来结束,也可以在 Activity结束之后(onDestroy)自动结束。

Service的生命周期

      Service有startService()和bindService()两种启动Service方法,每种方法Service的生命周期是不一样的。

     1 通过startService()
       Service会经历 onCreate --> onStartCommand()    注: onStartCommand()方法可代替onStart()方法,但测试得两个方法都调用了顺序为  onCreate()-->onStartCommand()-->onStart()-->onDestroy()

 


       stopService的时候直接onDestroy

       如果是 调用者 直接退出而没有调用stopService的话,Service会一直在后台运行。
       下次调用者再起来仍然可以stopService。

       如果调用startService()方法前服务已经被创建,多次调用startService()方法并不会导致多次 创建服务,
但会导致多次调用onStart()方法。采用startService()方法启动的服务,只能调用Context.stopService()方法结 束服务

    2 通过bindService()  
       Service只会运行onCreate()-->onBind()

      这个时候 调用者和Service绑定在一起
       unbindService的时候  onUnbind()-->onDestroyed()
      调用者退出了,Srevice就会调用onUnbind()-->onDestroyed()
      所谓绑定在一起就共存亡了。 

如果调用bindService()方法前服务已经被绑定,
多次调用bindService()方法并不会导致多次创建服务及绑定(也就是说onCreate()和onBind()方法并不会被多次调用)。

注意:Service的onCreate的方法只会被调用一次,
就是你无论多少次的startService又 bindService,Service只被创建一次。
如果先是bind了,那么start的时候就直接运行Service的onStart方法,
如果先是start,那么bind的时候就直接运行onBind方法。如果你先bind上了,就stop不掉了,
只能先UnbindService, 再StopService,所以是先start还是先bind行为是有区别的。

在Activity中得到绑定的Service对象:

在Service类中:

 public class MyBinder extends Binder{
        public MyService getService(){
            return MyService.this;
        }
  }

public IBinder onBind(Intent intent) {
        return new MyBinder();
  }

 在Activity中 :

ServiceConnection serviceConnection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
            MyService service = ((MyService.MyBinder) iBinder).getService();
        }

        @Override
        public void onServiceDisconnected(ComponentName componentName) {

        }
 };

posted on 2012-11-05 11:15  Snow〃冰激凌  阅读(245)  评论(0编辑  收藏  举报