Service初步

剛剛開始學Service,簡短的寫一點有關創建和進行數據交互的東西,以便自己以後學起來方便。


下面的這個小程序簡單的描述瞭如何進行訪問者和服務之間的交互,界面只有一個按鈕,點擊之後,會以Toast的形式彈出一個數值,表示當前運行在服務裏的值(該值每半秒加1)。


步驟開始:大笑

第一步:創建一個Service

public class ServiceTest extends Service {

	@Override
	public IBinder onBind(Intent intent) {
		// TODO Auto-generated method stub
		System.out.println("onBind");
		return binder;
	}

	@Override
	public void onCreate() {
		// TODO Auto-generated method stub
		super.onCreate();
		System.out.println("onCreate");
	}

	@Override
	public void onStart(Intent intent, int startId) {
		// TODO Auto-generated method stub
		super.onStart(intent, startId);
		System.out.println("onStart");
	}

	@Override
	public int onStartCommand(Intent intent, int flags, int startId) {
		// TODO Auto-generated method stub
		System.out.println("onStartCommand");
		return super.onStartCommand(intent, flags, startId);
	}

	@Override
	public void onDestroy() {
		// TODO Auto-generated method stub
		super.onDestroy();
		System.out.println("onDestroy");
		quitFlag = true;
	}

	@Override
	public boolean onUnbind(Intent intent) {
		// TODO Auto-generated method stub
		System.out.println("onUnbind");
		return super.onUnbind(intent);
	}
}
需要注意的是,必須要實現的是onBind方法,返回一個IBinder對象(主要是這個對象來進行交互)。


第二布:構造IBinder對象

在Service裏構造IBinder對象,是很常見的實現邏輯。把Binder的實現作爲Service的內部類。

public class MyBinder extends Binder
	{
		public long getCount()
		{
			return count;
		}
	}

具體應該有些什麼方法,完全取決於具體業務。


第三步:在Service的onCreate或onStartCommand方法中,寫業務邏輯

	public void onCreate() {
		// TODO Auto-generated method stub
		super.onCreate();
		System.out.println("onCreate");
		new Thread(new Runnable(){
			public void run()
			{
				while(!quitFlag)
				{
					try
					{
						count++;
						Thread.sleep(500);
					}
					catch(InterruptedException e){
						e.printStackTrace();
					}
				}
			}
		}).start();
	}
這個count的值,通過Binder返回到訪問者方。


第四步:在Activity中創建ServiceConnection對象

ServiceConnection用於監聽訪問者和Service的鏈接情況,鏈接成功時執行回調onServiceConnected(ComponentName, IBinder)方法,後面的IBinder方法就是Service中onBind方法返回的對象。斷開鏈接時執行回調onServiceDisconnected方法。

先在Activity中聲明Binder對象

ServiceTest.MyBinder binder;

然後聲明ServiceConnection對象

		ServiceConnection connection = new ServiceConnection() {
			
			@Override
			public void onServiceDisconnected(ComponentName name) {
				// TODO Auto-generated method stub
				System.out.println("Service disconnected");
				
			}
			
			@Override
			public void onServiceConnected(ComponentName name, IBinder service) {
				// TODO Auto-generated method stub
				binder = (ServiceTest.MyBinder)service;
				System.out.println("Service & Activity Connected");
			}
		};

在onServiceConnected方法中,把Activity中的Binder對象賦值成從Service返回的對象。

之後就可以用Binder對象處理數據了。


第五步:綁定Activity和Service

bindService(intent, connection, BIND_AUTO_CREATE);

經過上面五步,就可以通過Binder對象來操作Service裏面的數據了,實現了交互。



發佈了36 篇原創文章 · 獲贊 4 · 訪問量 48萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章