liguofeng29’s blog

個人勉強用ブログだっす。

AndroidのService- Serviceと通信する

Serviceと通信するためには、
bindService()とunBindService()を利用してServiceの起動と終了を行う。

Serviceを実装する際に、
IBinder onBind(Intent intent)でService通信するためのオブジェクトを返す必要がある。

bindService(Intent service, ServiceConnection conn, int flags)

  • service : Intentを使って起動するServiceを指定
  • conn : このオブジェクトを使ってServiceとの接続状況を監視する
  • flags: Serviceを自動生成するか
    • 0 : 自動生成しない
    • BIND_AUTO_CREATE : 自動生成

サンプルコード


概要 :

  • BindService.javaはバインドされると内部で一秒ごとにcountし、getCount()で値を返す
  • MainActivity.javaはSerivceをバインドし、Sericeのcountを取得し表示する
  • xmlファイルは省略

BindService.java

package com.example.liguofeng.firstservice;

import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;

public class BindService extends Service {
    private int count;
    private boolean quit;
    // onBind()で返すBinder
    private MyBinder binder = new MyBinder();

    public class MyBinder extends Binder {
        public int getCount() {
            return count;
        }
    }

    @Override
    public IBinder onBind(Intent intent) {
        System.out.println("Service is binded.");
        return binder;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        System.out.println("Service is created.");

        // 別スレッド
        new Thread(){
            @Override
            public void run() {
                while (!quit) {
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        // nothing
                    }
                    count++;
                }
            }
        }.start();
    }

    @Override
    public boolean onUnbind(Intent intent) {
        System.out.println("Serivce is unbinded.");
        return true;
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        System.out.println("Service is destory.");
        this.quit = true;
    }
}

MainActivity .java

package com.example.liguofeng.firstservice;

import android.app.Service;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.IBinder;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

    Button bind, unbind, getServiceStatus;
    // 起動するServiceのBinder
    BindService.MyBinder binder;

    // ServiceConnectionオブジェクト
    private ServiceConnection conn = new ServiceConnection() {

        // Service接続成功時のCallback
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            System.out.println("Service connected.");
            binder = (BindService.MyBinder) service;
        }

        // Service異常切断時のCallback
        @Override
        public void onServiceDisconnected(ComponentName name) {
            System.out.println("Service disconnected.");
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        bind = (Button) findViewById(R.id.bindBtn);
        unbind = (Button) findViewById(R.id.unbindBtn);
        getServiceStatus = (Button) findViewById(R.id.statusBtn);
        // 起動用Intent
        final Intent intent = new Intent(MainActivity.this, BindService.class);

        bind.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // bind service
                bindService(intent, conn, Service.BIND_AUTO_CREATE);
            }
        });

        unbind.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // unbind service
                unbindService(conn);
            }
        });

        getServiceStatus.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(MainActivity.this,
                        "Serviceのcount値は:" + binder.getCount(),
                        Toast.LENGTH_SHORT)
                        .show();;
            }
        });
    }
}

f:id:liguofeng29:20151215233935g:plain