星期一, 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

沒有留言: