天天看點

Android 四大元件學習之Service三

上節我們學習了,如何用StartService啟動服務,這節學習如何用BindService啟動一個服務

首先看MyActivity的代碼部分:

public class MyActivity extends Activity {

	private Button btn_start;
	private Button btn_end;
	private MyServiceConnection sConnection;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_myservice);
		
		btn_start = (Button)findViewById(R.id.button1);
		btn_end = (Button)findViewById(R.id.button2);
		btn_start.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View arg0) {
				// 啟動服務
				Intent intent = new Intent(MyActivity.this, MyService.class);
				//startService(intent);
				Log.i("MyActivity", "建立服務按鈕被按下!");
				bindService(intent, sConnection, Context.BIND_AUTO_CREATE);
			}
		});
		
		btn_end.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View arg0) {
				// 銷毀服務
				Intent intent = new Intent(MyActivity.this, MyService.class);
				//stopService(intent);
				Log.i("MyActivity", "銷毀服務按鈕被按下!");
				unbindService(sConnection);
			}
		});
	}
	
	public class MyServiceConnection implements ServiceConnection
	{

		@Override//當連接配接服務成功後調用
		public void onServiceConnected(ComponentName arg0, IBinder arg1) {
			// TODO Auto-generated method stub
			Log.i("MyActivity", "onServiceConnected");
			
		}

		@Override//當server所在的程序由于異常終止或者其他原因終止調用
		public void onServiceDisconnected(ComponentName arg0) {
			// TODO Auto-generated method stub
			Log.i("MyActivity", "onServiceDisconnected");
		}
	}
}           

複制

這次我們用的是bindService啟動服務,而bindService和StartServer明顯不同的就是傳遞的參數不同。bindService需要三個參數:

參數1: Intent不用多說

參數2:該參數是一個ServiceConnection的對象,該對象用于監聽通路者和Service之間的連接配接情況。其中,OnServiceConnected是當調用者與服務連接配接成功後調用,注意的是OnserviceDisconnected不是調用者與服務斷開時後調用,而是由于某種原因異常終止等才調用

參數3:指定綁定時是否自動建立service,當然了是service還沒建立時。

布局檔案和上一次的一樣,不再多說

MyService的代碼如下:

public class MyService extends Service {

	private MyThread thread;
	private boolean stopFlag = false;
	
	@Override//必須實作的方法
	public IBinder onBind(Intent arg0) {
		// TODO Auto-generated method stub
		
		//服務運作後,啟動線程
		if(!stopFlag)
		{
			thread.start();
			thread.setFlag(true);	
		}
		Log.i("MyService", "onBind------------");
		return null;
	}
	
	@Override//被建立時的調用
	public void onCreate() {
		// TODO Auto-generated method stub
		
		//服務建立時,執行個體化MyThread
		thread = new MyThread();
		Log.i("MyService", "onCreate------------");
		
		super.onCreate();
	}
	
	@Override
	@Deprecated//OnStart方法現在被OnStartCommd已經取代,其實在OnStartCommand也調用了OnStart
	public void onStart(Intent intent, int startId) {
		// TODO Auto-generated method stub
		super.onStart(intent, startId);
		Log.i("MyService", "onStart------------");
	}
	
	
	@Override//啟動時會調用
	public int onStartCommand(Intent intent, int flags, int startId) {
		// TODO Auto-generated method stub
		Log.i("MyService", "onStartCommand------------");
		//服務運作後,啟動線程
		if(!stopFlag)
		{
			thread.start();
			thread.setFlag(true);	
		}
		return super.onStartCommand(intent, flags, startId);
	}
	
	@Override
	public void onDestroy() {
		// TODO Auto-generated method stub
		
		//服務銷毀時,停止線程任務
		thread.setFlag(false);
		Log.i("MyService", "onDestroy------------");
		
		super.onDestroy();
	}
	
	@Override
	public boolean onUnbind(Intent intent) {
		// TODO Auto-generated method stub
		Log.i("MyService", "onUnbind------------");
		return super.onUnbind(intent);
	}
	
	class MyThread extends Thread
	{
		//設定flag
		public void setFlag(Boolean flag)
		{
			stopFlag = flag;
		}
		
		@Override
		public void run() {

			super.run();
			while(stopFlag)
			{
				//設定時間的輸出方式
				SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
				String  time = format.format(new Date());
				
				//顯示時間
				Log.i("MyService", time);
				
				try {
					//延遲一秒
					Thread.sleep(1000);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
	}           

複制

當然了記得在配置檔案中注冊service

接下來看結果分析:

當點選啟動服務後:

Android 四大元件學習之Service三

可以看到服務已經綁定

當點選銷毀服務後:

Android 四大元件學習之Service三

可以看到服務已經解綁,同時服務銷毀了。

今天關于bindService啟動服務就到這裡