1. 程式人生 > >Android 四大組件學習之Service六

Android 四大組件學習之Service六

div view 代理 執行 article 連接 我想 ces rac

上幾節。我們學習怎樣用StartServer啟動一個服務,用bindServer去綁定一個服務。以及服務的生命周期,以及什麽是IntentService。

也許有讀者會發現,我們BindServer中的第二個參數也就是ServiceConnection這種方法在將用bindService時好像沒用到。

那本節課就學習。


那我們先說個事。上大學的時候。我學習不好,還是那種常常曠課的同學。

長期下去,老師跟前就混的不好了。

有次班裏評選黨員,我就想競爭一下,可是因為我常常不上課的同學,自然幾率就小,所以我就想到走後門。 咋給導員點錢唄,反正導員是貪官,是貪官哪有不貪的。可是我不認識導員啊,那怎麽辦? 可是我舍友那是導員之前的紅人啊,能夠通過我舍友把錢給導員。然後讓導員給我整個黨員唄。

大概流程是這種:
技術分享

那我們把這個轉化為代碼:

這個就相當與我們用於一個Activity去啟動一個服務。可是服務有個方法,Activity想用可是卻拿不到,僅僅能通過第三方去幫他拿。

上圖中Activity就是我, 而Seriver就是貪官導員,僅僅有導員能給你一個名額讓你成為黨員。可是你不認識導員,所以就得去找你舍友,也就是導員的親信。


那問題如今轉話為: 我要找我舍友,也就是導員的親信了。

那兩種啟動服務的方式。那種服務當創建後能返回給你這個親信呢? 明顯startService啟動的服務是沒有的。

可是bindService啟動服務有:

	@Override
	public IBinder onBind(Intent intent) {
		// TODO Auto-generated method stub
		return null;
	}

就是bindService啟動服務後,通過return返回值,默認情況下是null的。

既然分析到,bindService是能夠返回到服務的,擔不是服務本身,僅僅是服務的代理而已。

public class MainActivity extends Activity {

	private Intent intent;
	private MyServiceConn conn;
	SheYou me;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        intent = new Intent(this, DangYuanService.class);
        conn = new MyServiceConn();
        //綁定服務
        bindService(intent, conn, BIND_AUTO_CREATE);
    }
    
    //我想成為黨員的方法
    public void toDoDangyuan(View v)
    {
    	//調用舍友的方法
    	me.ToBeDangYuan();
    }
    
    class MyServiceConn implements ServiceConnection
    {
    	//當服務連接成功後調用
		@Override
		public void onServiceConnected(ComponentName name, IBinder service) {
			// 得到服務的代理
			me = (SheYou) service;
		}

		@Override
		public void onServiceDisconnected(ComponentName name) {
			// TODO Auto-generated method stub
			
		}
    }
}

服務代碼:
public class DangYuanService extends Service {

	@Override
	public IBinder onBind(Intent intent) {
		//返回服務的代理。也就是貪官導員的親信
		return new SheYou();
	}
	
	//舍友獨有的能給我辦黨員的方法
	class SheYou extends Binder
	{
		//中間中(舍友)獨有的方法,讓你成為黨員
		public void ToBeDangYuan()
		{
			DangYuan();
		}
	}
	
	//服務自己的方法,也即是導員的權利
	public void DangYuan()
	{
		Log.i("DangYuanService", "僅僅需1000元就能成為黨員!");
	}

}

執行效果就知道了:我舍友找到導員,導員說“僅僅需1000元吉行”。 看看,導員多貪

技術分享

我當時就想舉報貪官,但是我還想著畢業呢。 就沒舉報貪官。


接著,我們導員還有個嗜好。那就是喝酒,當然了我舍友那必需要參加的。

	class SheYou extends Binder
	{
		//中間中(舍友)獨有的方法。讓你成為黨員
		public void ToBeDangYuan()
		{
			DangYuan();
		}
		
		public void HeJiu()
		{
			Log.i("DangYuanService", "陪導員喝酒!!!!");
		}
	}

給我舍友加上一個新方法,陪導員喝酒

當然了陪導員喝酒。那僅僅有導員的親信才幹參加。像我這樣的級別的人。那是不能參加的。當然也就無權知道了

    //我想成為黨員的方法
    public void toDoDangyuan(View v)
    {
    	//調用舍友的方法
    	me.ToBeDangYuan();
    	me.HeJiu();
    	
    }
那如今我訪問喝酒的方法還是ok的。

按道理我是無權知道的。

那就不行了。那就對服務改動

這時候我們創建一個專門僅僅有當黨員的借口:

public interface DangYuanInterface {

	//僅僅有一個方法,你能知道。那就是黨員的事情
	public void ToBeDangYuan();
}
然後讓舍友。也就是中間人,實現這個接口

	class SheYou extends Binder implements DangYuanInterface
	{
		//中間中(舍友)獨有的方法,讓你成為黨員
		public void ToBeDangYuan()
		{
			DangYuan();
		}
		
		public void HeJiu()
		{
			Log.i("DangYuanService", "陪導員喝酒!!!!");
		}
	}
然後,Activity中定義一個黨員的接口

DangYuanInterface dangyuan;

然後得到這個中間人對象:

    public void toDoDangyuan(View v)
    {
    	//調用舍友的方法
    	dangyuan.ToBeDangYuan();
    	
    }
    
    class MyServiceConn implements ServiceConnection
    {
    	//當服務連接成功後調用
		@Override
		public void onServiceConnected(ComponentName name, IBinder service) {
			// 得到服務的代理
			dangyuan = (DangYuanInterface) service;
		}

		@Override
		public void onServiceDisconnected(ComponentName name) {
			// TODO Auto-generated method stub
			
		}
    }

這時候你僅僅能知道關於黨員的事情。別的事情你無權過問。


這樣以後想須要獲取服務裏的方法。就能夠通過onBind的返回值得到服務的代理。記住不是服務的本身。

通常情況下把服務的代理或者中間人,一般把中間人獨有的方法抽成接口。


Android 四大組件學習之Service六