LoginSignup
10
14

More than 3 years have passed since last update.

[Android] Serviceクラス(bindService)

Posted at

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

以下のようにうまくいった。
スクリーンショット (1).png

困ったところ

AndroidManifestへの登録を忘れていたが、それ以外は特になかった。

感想

参考サイトには使わなかったメソッドもあったので、またの機会に使ってみたい。

参考URL

サンプル
http://javait.hatenablog.com/entry/2015/12/15/235135

Serviceの詳しい説明
http://ria10.hatenablog.com/entry/20121110/1352537601

10
14
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
14