资料上说有两种方式启动一个Service,他们对Service生命周期的影响是不一样的。
1 通过startService
 Service会经历 onCreate -> onStart
 stopService的时候直接onDestroy
 如果是调用者自己直接退出而没有调用stopService的话,Service会一直在后台运行。下次调用者再起来可以stopService。2 通过bindService
 Service只会运行onCreate, 这个时候服务的调用者和服务绑定在一起
 调用者退出了,Service就会调用onUnbind->onDestroyed,所谓绑定在一起就共存亡了。并且这种方式还可以使得调用方(例如)调用服务上的其他的方法。
关于第2点说调用者退出了,那么Service就会调用onUnbind->onDestroyed。我写了一个demo查看生命周期发现并不是这样的,调用的activity退出了,service并没有调用onDestroyed,还在运行,这是为什么呢?

解决方案 »

  1.   

    贴代码,老实说服务的3种,我只有以一种和AIDL,简单绑定型还真没试过,你贴代码,我分析下
      

  2.   

    bind方式启动的service,activity退出后,service还是可以继续运行的。
      

  3.   

    我也觉得文档里面说的有问题。
    activity退出时,不会影响Service(通过bind方式创建的)的运行,也不会自动调用UnbindService,相反,如果手动调用UnbindService,反而会让Service崩溃。
      

  4.   

    很多资料上都是象楼主贴的那样说的,绑定启动Service()后,就同生共死了。但是,如果,在biand 之前已经有startService()了,那就会直到,unbindService()和stoptService()之后Service才会被结束
      

  5.   

    Activity中是不是没写这个注销绑定的方法吧
    unbindService(_connection);bindService这种方式启动,在手机上按Home键Activity是不会退出的,再次进来点击绑定也不会执行任何方法,他是不执行onStart的,但是要按back的话,Activity会直接退出,Service调用onUnbind-->onDestroy
      

  6.   

    Activity中没写注销绑定的方法是什么意思,我把activity中的代码贴出来:private ServiceConnection mServiceConnection = new ServiceConnection() {

    public void onServiceConnected(ComponentName name,IBinder service)
    {
    mMyService = ((MyService.MyBinder)service).getService();
    mTextView.setText("I am from Service : "+ mMyService.getSystemTime());
    }
    public void onServiceDisconnected(ComponentName name)
    {

    }
    };

    @Override
    public void onCreate(Bundle saveInstanceState)
    {
    super.onCreate(saveInstanceState);
    setContentView(R.layout.main);
    setupViews();

    Log.e(TAG, "start onCreate...");
    Toast.makeText(getBaseContext(), "Activity onCreate", Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onStart()
    {
    super.onStart();
    Log.e(TAG, "start onStart...");
    Toast.makeText(getBaseContext(), "Activity onStart", Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onResume()
    {
    super.onResume();
    Log.e(TAG, "start onResume...");
    Toast.makeText(getBaseContext(), "Activity onResume", Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onPause()
    {
    super.onPause();
    Log.e(TAG, "start onPause...");
    Toast.makeText(getBaseContext(), "Activity onPause", Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onStop()
    {
    super.onStop();
    Log.e(TAG, "start onStop...");
    Toast.makeText(getBaseContext(), "Activity onStop", Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onDestroy()
    {
    super.onDestroy();
    Log.e(TAG, "start onDestroy...");
    Toast.makeText(getBaseContext(), "Activity onDestroy", Toast.LENGTH_SHORT).show();
    }

    public void setupViews()
    {
    mContext = ServiceLifeCycle.this;        //通过debug,发现mContext id=8300604484368,类似于Win32的句柄
    mTextView = (TextView)findViewById(R.id.text);

    startServiceButton = (Button)findViewById(R.id.startservice);
    stopServiceButton = (Button)findViewById(R.id.stopservice);
    bindServiceButton = (Button)findViewById(R.id.bindservice);
    unbindServiceButton = (Button)findViewById(R.id.unbindservice);

    startServiceButton.setOnClickListener(this);
    stopServiceButton.setOnClickListener(this);
    bindServiceButton.setOnClickListener(this);
    unbindServiceButton.setOnClickListener(this);
    }

        public void onClick(View v)           //这样也是一种注册事件的方法,一般的写法就直接写在setOnClickListener的后面了,这里单独写出来也是可以的
        {
         if (v == startServiceButton)
         {
         //Intent i = new Intent();
         //i.setClass(ServiceLifeCycle.this, MyService.class);   //从Activity跳转到Service
         //mContext.startService(i);
         //startService(i);   这里直接用也可以,不要mContext来调,二者有何区别
        
         //以上代码和下面一句代码等效
         startService(new Intent(this, MyService.class));
         }
         else if (v == stopServiceButton)
         {
         Intent i = new Intent();
         i.setClass(ServiceLifeCycle.this, MyService.class);
         mContext.stopService(i);
         }
         else if (v == bindServiceButton)
         {
         Intent i = new Intent();
         i.setClass(ServiceLifeCycle.this, MyService.class);
         mContext.bindService(i, mServiceConnection, BIND_AUTO_CREATE);
         }
         else
    {
         mContext.unbindService(mServiceConnection);
         }
        }
      

  7.   

    看来这个问题还是需要实际验证下,退出activtiy时,到底会不会执行onUnbind,onDestroy.
      

  8.   

    我试过按Back的话,Service 调用onUnbind,但是如果用手机任务管理器中直接清除程序,就不会调到onUnbind