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