星期一, 3月 27, 2017
[ Android ] 使用Service (二) bindService / unbindService
這篇要解說bind/unbind的用法,
也就是圖的右邊。
用Bind和Start來啟動service最大的差別是,
"我可以透過Bind的方式,來使用Service裡的任何一個public function"。
分兩階段來說明如何使用,
程式主要是繼續著上一篇文章修改。
(一)Activity內使用
由於要用bindService()和unbindService()來操作,
所以設的參數也會不一樣。
重點是要宣告"ServiceConnection",
因為他會擔任activity和service之間的溝通,
private class connection implements ServiceConnection {.....}
所以宣告"connection"來繼承ServiceConnectioin,
然後裡面主要有兩個function來處理connect和disconnect的事件。
onServiceConnected()
在處理bind成功後,我要把裡面的service全部拿過來,
這樣才能在activity裡操作service裡的public function。
onServiceDisconnected()
這裡是在處理unbind後的事。
然後回到前面,
我把"connect"和"intent"一起送去service來做bind,
bindService(it, conn, Service.BIND_AUTO_CREATE);
之後如果成功就會開始執行onServiceConnected()內的東西了。
而在onServiceConnected()內需要去宣告一些東西來繼承service,
MyIBinder myBinder = (MyIBinder) service;
StartServices mBoundService = myBinder.getService();
我會在service裡宣告"MyIBinder"這個class,
而在這class裡有宣告"getService"這個function,
getService會回傳"StartServices"這個service的實體,
而在onServiceConnected內用mBoundService來接這個service實體,
最後就可以直接用這service來使用public function了。
mBoundService.download();
(二)Service內使用
在service裡面,
而剛提到的"MyIBinder"在這時就要建立,
public class MyIBinder extends Binder {
public StartServices getService() {
return StartServices.this;
}
}
這裡實作一個繼續Binder的class,
裡面會去實作一個"getService"的funciton,
為的是要把"service"實體回傳回去。
所以回傳值是service name。
一開始的onBind()原本會回傳null,
但現在用bind了,代表這function會被用到,
private final MyIBinder myIBinder = new MyIBinder();
public IBinder onBind(Intent intent) {
return myIBinder;
}
所以需要回一個binder回去給他,
把MyIBinder class實體化後,
當回傳值丟回去。
最後就做一個public function給activity呼叫,
public void download() {)
總結:
1. 當你bind成功後,會回傳一個實體service來操作。
2. 如果你沒有start service,直接用stop service那不會有錯。
如果你沒bind service,直接用unbind service那會出錯。
3. activity和service可互相傳參數(example)
SourceCode
Ref 1
Ref 2
Ref 3
Ref 4
訂閱:
張貼留言 (Atom)

沒有留言:
張貼留言