bind/unbindメソッドを使用して起動および停止するバックグラウンドサービスを備えたアプリケーションの簡単な例を教えてください。私は30分間それをグーグルで探していましたが、それらの例はstartService/stopServiceメソッドを使用するか、私にとって非常に困難です。ありがとうございました。
このコードを使用して試すことができます:
protected ServiceConnection mServerConn = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder binder) {
Log.d(LOG_TAG, "onServiceConnected");
}
@Override
public void onServiceDisconnected(ComponentName name) {
Log.d(LOG_TAG, "onServiceDisconnected");
}
}
public void start() {
// mContext is defined upper in code, I think it is not necessary to explain what is it
mContext.bindService(intent, mServerConn, Context.BIND_AUTO_CREATE);
mContext.startService(intent);
}
public void stop() {
mContext.stopService(new Intent(mContext, ServiceRemote.class));
mContext.unbindService(mServerConn);
}
これらのメソッドをアクティビティに追加します。
_private MyService myServiceBinder;
public ServiceConnection myConnection = new ServiceConnection() {
public void onServiceConnected(ComponentName className, IBinder binder) {
myServiceBinder = ((MyService.MyBinder) binder).getService();
Log.d("ServiceConnection","connected");
showServiceData();
}
public void onServiceDisconnected(ComponentName className) {
Log.d("ServiceConnection","disconnected");
myService = null;
}
};
public Handler myHandler = new Handler() {
public void handleMessage(Message message) {
Bundle data = message.getData();
}
};
public void doBindService() {
Intent intent = null;
intent = new Intent(this, BTService.class);
// Create a new Messenger for the communication back
// From the Service to the Activity
Messenger messenger = new Messenger(myHandler);
intent.putExtra("MESSENGER", messenger);
bindService(intent, myConnection, Context.BIND_AUTO_CREATE);
}
_
そして、ActivityクラスでonResume()およびonPause()をovverridingすることにより、サービスにバインドできます。
_@Override
protected void onResume() {
Log.d("activity", "onResume");
if (myService == null) {
doBindService();
}
super.onResume();
}
@Override
protected void onPause() {
//FIXME put back
Log.d("activity", "onPause");
if (myService != null) {
unbindService(myConnection);
myService = null;
}
super.onPause();
}
_
サービスにバインドするときは、onCreate()
メソッドのみがサービスクラスで呼び出されることに注意してください。 Serviceクラスで、myBinderメソッドを定義する必要があります。
_private final IBinder mBinder = new MyBinder();
private Messenger outMessenger;
@Override
public IBinder onBind(Intent arg0) {
Bundle extras = arg0.getExtras();
Log.d("service","onBind");
// Get messager from the Activity
if (extras != null) {
Log.d("service","onBind with extra");
outMessenger = (Messenger) extras.get("MESSENGER");
}
return mBinder;
}
public class MyBinder extends Binder {
MyService getService() {
return MyService.this;
}
}
_
これらのメソッドを定義したら、アクティビティでサービスのメソッドに到達できます。
_private void showServiceData() {
myServiceBinder.myMethod();
}
_
最後に、_BOOT_COMPLETED_などのイベントが発生したときにサービスを開始できます
_public class MyReciever extends BroadcastReceiver {
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (action.equals("Android.intent.action.BOOT_COMPLETED")) {
Intent service = new Intent(context, myService.class);
context.startService(service);
}
}
}
_
サービスを開始すると、サービスクラスでonCreate()
およびonStartCommand()
が呼び出され、stopService()によって別のイベントが発生したときにサービスを停止できることに注意してください。イベントリスナーをAndroidマニフェストファイルに登録する必要があります。
_<receiver Android:name="MyReciever" Android:enabled="true" Android:exported="true">
<intent-filter>
<action Android:name="Android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
_
まず、理解する必要がある2つのこと、
bindService(new Intent("com.Android.vending.billing.InAppBillingService.BIND"), mServiceConn, Context.BIND_AUTO_CREATE);
ここでmServiceConn
はServiceConnection
class(inbuilt)のインスタンスです。実際には、ネットワーク接続状態を監視するための2つのメソッド(ネットワーク接続用と非接続用)を実装する必要があるインターフェースです。
IBinder
オブジェクトで応答を送信します。したがって、IBinder
オブジェクトは、(。)演算子を使用してService
のすべてのメソッドにアクセスするハンドラーです。。
MyService myService;
public ServiceConnection myConnection = new ServiceConnection() {
public void onServiceConnected(ComponentName className, IBinder binder) {
Log.d("ServiceConnection","connected");
myService = binder;
}
//binder comes from server to communicate with method's of
public void onServiceDisconnected(ComponentName className) {
Log.d("ServiceConnection","disconnected");
myService = null;
}
}
myservice.serviceMethod();
ここで、myService
はオブジェクトであり、serviceMethodはサービスのメソッドです。この方法により、クライアントとサーバー間で通信が確立されます。