Android Service用法詳解

什麼是Service?

Service是 Android 系統中的一種組件,它和Activity的級別差不多,但又Activity不同,它是不能與用戶交互的,但可以和其他組件進行交互。它不能自己運行,只能後臺運行。


Service的特點:沒有可視的UI、後臺運行,運行不阻塞前臺UI、擁有服務的進程具有較高的優先級


Service的生命週期:

Android Service的生命週期並不像Activity那麼複雜,它只繼承了onCreate(),onStart(),onDestroy()三個方法,當我們第一次啓動Service時,先後調用了onCreate(),onStart()這兩個方法,當停止Service時,則執行onDestroy()方法,這裏需要注意的是,如果Service已經啓動了,當我們再次啓動Service時,不會在執行onCreate()方法,而是直接執行onStart()方法,具體的可以看下面的實例。


服務啓動的兩種方式及用法:context.startService()和context.bindService()方式啓動

提醒:使用Service之前必須在androidMainfest.xml 中註冊


① context.startService()

     啓動:context.startService() ---> onCreate() ---> onStartCommand()

     銷燬:ontext.stopService()   ---> onDestroy();

     如果Service還沒運行,則Android會先調用onCreate()方法,然後再調用onStartCommand();
     如果Service已經運行了,則只調用onStartCommand(),所以一個Service的onStartCommand(),方法      可能會調用多

實例代碼:通過打印結果可知其執行順序

com.liu.activity包:

public class ServiceTestActivity extends Activity {

	private Button btn_start, btn_end;

	public void onCreate(Bundle savedInstanceState) {

		super.onCreate(savedInstanceState);
		setContentView(R.layout.service_test);

		btn_start = (Button) findViewById(R.id.btn_satrt);
		btn_end = (Button) findViewById(R.id.btn_end);

		btn_start.setOnClickListener(new OnClickListener() {

			public void onClick(View v) {
				System.out.println("--->啓動服務");
				// 通過 Intent 啓動已註冊的 service
				startService(new Intent("com.sharpandroid.Music"));

			}
		});

		btn_end.setOnClickListener(new OnClickListener() {

			public void onClick(View v) {
				System.out.println("--->停止服務");
				stopService(new Intent("com.sharpandroid.Music"));

			}
		});

	}

}



com.liu.service包:

public class Service_MusicPlayer extends Service {

	private final String TAG = "Service_MusicPlayer";
	MediaPlayer mPlayer;

	public void onCreate() {
		Log.i(TAG, "--------->OnCreate()");
		super.onCreate();
	}

	public void onStart(Intent intent, int startId) {
		Log.i(TAG, "--------->OnStart()");
		// 在layout下創建raw文件夾,放一個音樂文件(自命名如music)在raw下
		mPlayer = MediaPlayer.create(this, R.raw.music);
		super.onStart(intent, startId);
		mPlayer.start();
	}

	public void onDestroy() {
		Log.i(TAG, "--------->onDestroy()");
		super.onDestroy();
		mPlayer.stop();
	}

	public IBinder onBind(Intent intent) {
		return null;
	}

}

結果: 

 





② context.bindService()

     啓動:context.bindService() ---> onCreate() --->onBind();
     銷燬:onUnibind() ---> onDestroy()
     onBind()方法將返回給客戶端一個IBind接口實例,IBind允許客戶端調用服務的方法,比如得到Service 允許狀態或者其他操作這個時 ?       候調用者(Context,例如Activity)會和Service綁定在一起,Context退出了,Service就會調用onUnibind() ---> onDesytoy()相應退出 

實例代碼:

com.liu.activity包

public class TestActivity extends Activity {

	private Button btn_satrt, btn_end;
	private Bind_Service Bind_Service = null;
	protected boolean isBound = false;

	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);

		btn_satrt = (Button) findViewById(R.id.btn_start);
		btn_end = (Button) findViewById(R.id.btn_end);

		btn_satrt.setOnClickListener(new OnClickListener() {

			public void onClick(View v) {
				System.out.println("Bind服務");
				Intent intent = new Intent(TestActivity.this,
						Bind_Service.class);
				// bindService(service, conn, flags)用來綁定一個服務
				TestActivity.this.bindService(intent, mConnection,
						Context.BIND_AUTO_CREATE);
				isBound = true;
			}
		});

		btn_end.setOnClickListener(new OnClickListener() {

			public void onClick(View v) {
			if (isBound) {
				System.out.println("unBind服務");
				// unbindService(conn)解除綁定
				TestActivity.this.unbindService(mConnection);
                        }
                       }
		});
	}
    //ServiceConnection是bindService()的關鍵步驟,將Activity與Service捆綁在一起
	private ServiceConnection mConnection = new ServiceConnection() {

		public void onServiceDisconnected(ComponentName name) {
			Bind_Service = null;
        }

		public void onServiceConnected(ComponentName name, IBinder service) {
         Bind_Service = ((Bind_Service.LocalBinder) service).getService();
		}
	};
}
com.liu.service包:

public class Bind_Service extends Service {

	//內部類,作用返回Bind_Service對象
	public class LocalBinder extends Binder {
		public Bind_Service getService() {
			return Bind_Service.this;
		}
	}

	@Override
	public IBinder onBind(Intent arg0) {
		System.out.println("------->onBind()");
		return null;
	}

	@Override
	public void onCreate() {
		System.out.println("------->onCreate()");
		super.onCreate();
	}

	@Override
	public void onDestroy() {
		System.out.println("------->onDestroy()");
		super.onDestroy();
	}

	@Override
	public void onStart(Intent intent, int startId) {
		System.out.println("------->onStart()");
		super.onStart(intent, startId);
	}

	@Override
	public int onStartCommand(Intent intent, int flags, int startId) {
		System.out.println("------->onStartCommand()");
		return super.onStartCommand(intent, flags, startId);
	}

}
結果:



總結:startService()啓動方式代碼少、簡單,適用於簡單的應用,而bindService()操作性強,使用起來想Activity。

兩者區別:bindService()方式啓動的Service隨Activity的生命結束而結束,startService()則不 受影響。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章