July 9, 2012

bindService()で始める、Binderクラスで作るService

Binderクラスを使って作る最も一般的なServiceの作成方法です。

bindService()を使ってServiceをBindし、Serviceで提供するユーザー関数を直接コールすることができます。Bindしている間Serviceは存在し、Unbindすると削除されます。複数のActivityからマルチでBindすることもできます。

bindService()を使ったServiceの作り方は3種類ありますが、今回紹介する方法が最も一般的です。なぜなら、アプリ内(正確にはServiceと同一プロセスで動くコンポーネントにServiceを提供する場合)でServiceを提供する場合はこの方法が最も適切かつ簡単なため、他のプロセスやアプリに機能を提供するなど特別なケースでない限り、他の方法を使う必要がないからです。

おおざっぱな流れは、Service側のクラスはBinderを拡張したユーザークラスを作成します。bindService()を実行するとonBind()がコールされるので、そのユーザーインスタンスを返します。呼び出し側のActivityではBindされるとServiceConnectionクラスのonServiceConnected()が呼ばれるので、ここでBinder経由でServiceインスタンスを取得します。あとはそのServiceインスタンスを使って、Service側でユーザー定義した関数を直接コールすることができます。

public class SampleService extends Service {
    private final static String TAB = "SampleService";
    private final IBinder mBinder = new LocalBinder();

    public class LocalBinder extends Binder {
        SampleService getService() {
            return SampleService.this;
        }
    }

    @Override
    public void onCreate() {
        Log.i(TAB,"onCreate");
    }

    @Override
    public IBinder onBind(Intent intent) {
        return mBinder;
    }

    @Override
    public void onDestroy() {
        Log.i(TAB,"onDestroy");
    }

    // Methods for client
    public void userFunction() {
        Log.i(TAB,"userFunction");
    }
}

public class SampleAppActivity extends Activity {
    private final static String TAB = "SampleAppActivity";
    private SampleService mSampleService;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.i(TAB,"onCreate");

        setContentView(R.layout.main);

        Button button = (Button) findViewById(R.id.button);
        button.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                mSampleService.userFunction();
            }
        });
    }
 
    @Override
    public void onStart() {
        Log.i(TAB,"onStart");
        super.onStart();
        // Bind
        Intent intent = new Intent(getApplicationContext(), SampleService.class);
        bindService(intent, mSampleServiceConnection, Context.BIND_AUTO_CREATE);
    }

    @Override
    public void onStop() {
        Log.i(TAB,"onStop");
        super.onStop();
        // Unbind
        unbindService(mSampleServiceConnection);
    }

    private ServiceConnection mSampleServiceConnection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            SampleService.LocalBinder binder = (SampleService.LocalBinder)service;
            mSampleService = binder.getService();
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
        }
    };
}

参考:Android Developers:Bound Services

No comments:

Post a Comment