bind/unbind service example (android)

AndroidBindingService

Android Problem Overview


can you give me a simple example of an application with background service which uses bind/unbind methods to start and stop it? I was googling for it for a half-hour, but those examples use startService/stopService methods or are very difficult for me. thank you.

Android Solutions


Solution 1 - Android

You can try using this code:

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);
}

Solution 2 - Android

Add these methods to your Activity:

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);
}

And you can bind to service by ovverriding onResume(), and onPause() at your Activity class.

@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();
}

Note, that when binding to a service only the onCreate() method is called in the service class. In your Service class you need to define the myBinder method:

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;
	}
}

After you defined these methods you can reach the methods of your service at your Activity:

private void showServiceData() {  
    myServiceBinder.myMethod();
}

and finally you can start your service when some event occurs like 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);
        }
    }
}

note that when starting a service the onCreate() and onStartCommand() is called in service class and you can stop your service when another event occurs by stopService() note that your event listener should be registerd in your Android manifest file:

<receiver android:name="MyReciever" android:enabled="true" android:exported="true">
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED" />
        </intent-filter>
</receiver>

Solution 3 - Android

First of all, two things that we need to understand,

Client

  • It makes request to a specific server

bindService(new Intent("com.android.vending.billing.InAppBillingService.BIND"), mServiceConn, Context.BIND_AUTO_CREATE);

here mServiceConn is instance of ServiceConnection class(inbuilt) it is actually interface that we need to implement with two (1st for network connected and 2nd network not connected) method to monitor network connection state.

Server

  • It handles the request of the client and makes replica of its own which is private to client only who send request and this raplica of server runs on different thread.

Now at client side, how to access all the methods of server?

  • Server sends response with IBinder Object. So, IBinder object is our handler which accesses all the methods of Service by using (.) operator.

.

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;
    }
}

Now how to call method which lies in service

myservice.serviceMethod();

Here myService is object and serviceMethod is method in service. and by this way communication is established between client and server.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questionuser1049280View Question on Stackoverflow
Solution 1 - AndroidDawid SajdakView Answer on Stackoverflow
Solution 2 - AndroidlaplaszView Answer on Stackoverflow
Solution 3 - AndroidHardik GajeraView Answer on Stackoverflow