##Serviceとは
ダウンロードなどの処理時に、UI操作を阻害しないようにするため、Activityとは別に動作させることができる。
startService()とbindService()の2種類がある。今回はbindServiceについて記す。
・startService
Activityが破棄されても、stopSerivceかstopSelfによって明示的に終了するまで続く。
・bindService
バインドしているActivityがなくなると破棄される。
##使い方
Serviceを継承したクラスを作り、クライアント側から呼び出すことで使用できる。
まずクライアント側クラスは以下の通りである。
Mainctivity.java
public class MainActivity extends AppCompatActivity {
// 起動するServiceのBinder
BindService.MyBinder binder;
// ServiceConnectionオブジェクト
private ServiceConnection conn = new ServiceConnection() {
// Service接続成功時のCallback
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
binder = (BindService.MyBinder) service;
}
// Service異常切断時のCallback
@Override
public void onServiceDisconnected(ComponentName name) {
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 起動用Intent
final Intent intent = new Intent(MainActivity.this, BindService.class);
/*ServiceをBound状態にする。インスタンスがなければ作成を要請する。
*また、Serviceと通信するためのIBinderインターフェースはシステムからコピーされたものが渡される。
*/
bindService(intent, conn, Service.BIND_AUTO_CREATE);
//バインドを解除する。この時、条件によってはServiceも終了する。
unbindService(conn);
}
次にService側クラスの基本構造は以下の通りである。
AndroidManifestに登録しなければ使えないので気を付けて頂きたい。
BindService.java
public class BindService extends Service {
// onBind()で返すBinder
private MyBinder binder = new MyBinder();
//最初のbindService呼び出しのみ、システムにIBinderインターフェースを渡すために呼ばれる。
@Override
public IBinder onBind(Intent intent) {
return binder;
}
/*Serviceのインスタンスがない状態で、クライアントがstartServiceまたはbindServiceを呼んだ時に
*Serviceのインスタンス生成で呼ばれる。すでにインスタンスが存在している場合は呼ばれない。
*/
@Override
public void onCreate() {
super.onCreate();
}
/*インドしているクライアントが「全て」いなくなったとき。そのためunbindServiceが呼ばれても、
*ほかにバインドしているクライアントが存在した場合、onUnbindは呼ばれない。
*/
@Override
public boolean onUnbind(Intent intent) {
}
//バインドされたクライアントがなくなって、onUnbindが呼ばれたあとに呼ばれる
@Override
public void onDestroy() {
}
}
AndroidManifest.xml
<application
<service android:name=".BindService"/>
##サンプルの実装と結果
本記事では以下の記事のサンプルと同じものを作ってみた。(コードは割愛)
http://javait.hatenablog.com/entry/2015/12/15/235135
##困ったところ
AndroidManifestへの登録を忘れていたが、それ以外は特になかった。
##感想
参考サイトには使わなかったメソッドもあったので、またの機会に使ってみたい。
##参考URL
サンプル
http://javait.hatenablog.com/entry/2015/12/15/235135
Serviceの詳しい説明
http://ria10.hatenablog.com/entry/20121110/1352537601