Android bound service

  • bound service is started by calling bindService.
  • bound service doesn’t have an UI and it also running on the UI thread like a regular service.
  • bound service will stop when no components are binded to it anymore.
  • bound service can have multiple components bind to it.
  • bound service has components such as activity bind to it through a ServiceConnection, and use it to for communication.
  • bound service need an custom class which extends Binder.

Here is an example of bound service implementation in Android.

1. Create a class which extends from the Service, BoundService.java

public class BoundService extends Service {
    private static String LOG_TAG = "BoundService";
    private IBinder mBinder;
    private Random mGenerator;

    @Override
    public void onCreate() {
        super.onCreate();
        Log.v(LOG_TAG, "in onCreate");
        mBinder = new LocalBinder();
        mGenerator = new Random();
    }

    @Override
    public IBinder onBind(Intent intent) {
        Log.v(LOG_TAG, "in onBind");
        return mBinder;
    }

    @Override
    public void onRebind(Intent intent) {
        Log.v(LOG_TAG, "in onRebind");
        super.onRebind(intent);
    }

    @Override
    public boolean onUnbind(Intent intent) {
        Log.v(LOG_TAG, "in onUnbind");
        return true;
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        Log.v(LOG_TAG, "in onDestroy");
        mGenerator = null;
    }

    public String getRandomNum() {
        return "Random Number: " + mGenerator.nextInt(10000);
    }

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

2. Register it in the manifest.xml file in the application tag.

<service android:name=".BoundService"/>

3. Add the following in an Activity class. Assume the method boundService responds to a button click.

    BoundService mboundService;
    boolean mBound = false;
    public void boundService(View view) {
        String randomNum = mboundService.getRandomNum();
        Log.d("boundService", randomNum);
        Toast.makeText(this, randomNum, Toast.LENGTH_SHORT).show();
    }

    @Override
    protected void onStart() {
        super.onStart();
        // Bind to LocalService
        Intent intent = new Intent(this, BoundService.class);
        bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
    }

    @Override
    protected void onStop() {
        super.onStop();
        // Unbind from the service
        if (mBound) {
            unbindService(mConnection);
            mBound = false;
        }
    }


    /** Defines callbacks for service binding, passed to bindService() */
    private ServiceConnection mConnection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName className,
                                       IBinder service) {
            BoundService.LocalBinder binder = (BoundService.LocalBinder) service;
            mboundService = binder.getService();
            mBound = true;
        }

        @Override
        public void onServiceDisconnected(ComponentName arg0) {
            mBound = false;
        }
    };

Complete example in Github

Search within Codexpedia

Custom Search

Search the entire web

Custom Search