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