Service生命周期详解

在前面已多次使用了Service,相信大家对Service的生命周期大概已经有所了解了,这里简要归纳一下。

1、只以StartService方式启动:onCreate—->onStartCommand—->onDestroy。可以看出这个非常简单

注意:如果没有执行stopService而多次连续启动,只会多次执行onStartCommand,而不会多次执行onCreate。附上图片:

 

2、只以bindService方式启动:

onCreate—->onBind—->onUnbind—->onDestroy

注意:此过程可以循环执行,但是在调用unBindService方法前连续调bindService对应的onBind()只会调用一次。

附上图片:

3、StartService、bindService混合执行(先StartService再bindService再unBindService再bindService):

①onUnbind 方法return true(第二次bindService时会执行onRebind):

onCreate—->onStartCommand—->onBind—->onUnbind—->onRebind

②onUnbind 方法return super.onUnbind(intent)(第二次bindService时不会执行onRebind也不会执行onBind):

onCreate—->onStartCommand—->onBind—->onUnbind

此情况与上面情况相同点在于:执行了onUnbind后都可以再重新绑定,但这种情况不会调用onRebind也不会调用onBind,也就是说在一个生命周期内,onBind只能执行一次。

至于onStartCommand和onBind的顺序取决于先执行StartService还是先执行bindService。

附上图片:

下面通过一个示例来演示:

Activity:

[java][/java] view plaincopy

  1. package com.home.activity;
  2. import android.app.Activity;
  3. import android.content.ComponentName;
  4. import android.content.Intent;
  5. import android.content.ServiceConnection;
  6. import android.os.Bundle;
  7. import android.os.IBinder;
  8. import android.view.View;
  9. import android.widget.Button;
  10. import android.widget.TextView;
  11. import com.home.service.MyService;
  12. import com.home.servicelife.R;
  13. public class ServiceLifeTestActivity extends Activity {
  14.     private Intent intent;
  15.     private TextView show;
  16.     private Button unbindBtn;
  17.     @Override
  18.     protected void onCreate(Bundle savedInstanceState) {
  19.         super.onCreate(savedInstanceState);
  20.         setContentView(R.layout.main);
  21.         show = (TextView) findViewById(R.id.main_tv_show);
  22.         unbindBtn = (Button) findViewById(R.id.main_btn_unbind);
  23.         intent = new Intent(this, MyService.class);
  24.     }
  25.     public void click(View v) {
  26.         if (v.getId() == R.id.main_btn_start) {
  27.             startService(intent);
  28.         } else if (v.getId() == R.id.main_btn_bind) {
  29.             bindService(intent, myServiceConnection, BIND_AUTO_CREATE);
  30.             unbindBtn.setEnabled(true);
  31.         } else if (v.getId() == R.id.main_btn_unbind) {
  32.             unbindService(myServiceConnection);
  33.             unbindBtn.setEnabled(false);
  34.         } else if (v.getId() == R.id.main_btn_stop) {
  35.             intent = new Intent(this, MyService.class);
  36.             stopService(intent);
  37.         }
  38.     }
  39.     private ServiceConnection myServiceConnection = new ServiceConnection() {
  40.         @Override
  41.         public void onServiceConnected(ComponentName name, IBinder service) {
  42.             String systemTime = ((MyService.MyBinder) service).getSystemTime();
  43.             show.setText(“当前系统时间为:” + systemTime);
  44.         }
  45.         @Override
  46.         public void onServiceDisconnected(ComponentName name) {
  47.         }
  48.     };
  49. }

Service:

[java][/java] view plaincopy

  1. package com.home.service;
  2. import java.text.SimpleDateFormat;
  3. import java.util.Date;
  4. import android.app.Service;
  5. import android.content.Intent;
  6. import android.os.Binder;
  7. import android.os.IBinder;
  8. import android.util.Log;
  9. public class MyService extends Service {
  10.     private MyBinder myBinder = new MyBinder();
  11.     /**
  12.      * 必须实现的方法,只有以bindService方式启动才会调用,该方法返回一个建立连接后的IBinder接口对象
  13.      */
  14.     @Override
  15.     public IBinder onBind(Intent arg0) {
  16.         Log.i(“MyService”, “执行onBind”);
  17.         return myBinder;
  18.     }
  19.     /**
  20.      * 当Service第一次被创建时执行该方法
  21.      */
  22.     @Override
  23.     public void onCreate() {
  24.         Log.i(“MyService”, “执行onCreate”);
  25.         super.onCreate();
  26.     }
  27.     /**
  28.      * 以startService方式启动时会调用,该方法可能被多次调用
  29.      */
  30.     @Override
  31.     public int onStartCommand(Intent intent, int flags, int startId) {
  32.         Log.i(“MyService”, “执行onStartCommand”);
  33.         return super.onStartCommand(intent, flags, startId);
  34.     }
  35.     /**
  36.      * 当Service被断开连接时回调该方法
  37.      */
  38.     @Override
  39.     public boolean onUnbind(Intent intent) {
  40.         Log.i(“MyService”, “onUnbind”);
  41.         return super.onUnbind(intent);
  42.         // return true;
  43.     }
  44.     /**
  45.      * 重新绑定时执行该方法,前提是onUnbind返回true
  46.      */
  47.     @Override
  48.     public void onRebind(Intent intent) {
  49.         Log.i(“MyService”, “onRebind”);
  50.         super.onRebind(intent);
  51.     }
  52.     /**
  53.      * Service被关闭之前回调该方法
  54.      */
  55.     @Override
  56.     public void onDestroy() {
  57.         Log.i(“MyService”, “onDestroy”);
  58.         super.onDestroy();
  59.     }
  60.     public class MyBinder extends Binder {
  61.         /**
  62.          * 获取系统时间
  63.          *
  64.          * @return 系统时间
  65.          */
  66.         public String getSystemTime() {
  67.             SimpleDateFormat simpleDateFormat = new SimpleDateFormat(
  68.                     “yyyy-MM-dd HH:mm:ss”);
  69.             return simpleDateFormat.format(new Date());
  70.         }
  71.     }
  72. }

布局XML:

[html][/html] view plaincopy

  1. <LinearLayout xmlns:android=”http://schemas.android.com/apk/res/android”
  2.     android:layout_width=”match_parent”
  3.     android:layout_height=”match_parent”
  4.     android:orientation=”vertical” >
  5.     <Button
  6.         android:id=”@+id/main_btn_start”
  7.         android:layout_width=”wrap_content”
  8.         android:layout_height=”wrap_content”
  9.         android:onClick=”click”
  10.         android:text=”startService” />
  11.     <Button
  12.         android:id=”@+id/main_btn_bind”
  13.         android:layout_width=”wrap_content”
  14.         android:layout_height=”wrap_content”
  15.         android:onClick=”click”
  16.         android:text=”bindService” />
  17.     <Button
  18.         android:id=”@+id/main_btn_unbind”
  19.         android:layout_width=”wrap_content”
  20.         android:layout_height=”wrap_content”
  21.         android:onClick=”click”
  22.         android:text=”unbindService” />
  23.     <Button
  24.         android:id=”@+id/main_btn_stop”
  25.         android:layout_width=”wrap_content”
  26.         android:layout_height=”wrap_content”
  27.         android:onClick=”click”
  28.         android:text=”stopService” />
  29.     <TextView
  30.         android:id=”@+id/main_tv_show”
  31.         android:layout_width=”wrap_content”
  32.         android:layout_height=”wrap_content” />
  33. </LinearLayout>

大家可以自己试试,看看打印的出来的日志,便一目了然。

标签