Using OSGi services

Services can be registered and unregistered asynchronously at any time. Therefore, call a service for as short a time as possible. You can use the ServiceTracker class to track service availability concurrently.

About this task

If you want to track services, you can create a ServiceTracker object by using your bundle context, the interface you want, and the properties you want to match, and then open the tracker. You can query the tracker for the best match or all matches. Make sure that you do not occupy the service after you use it. You do not have to tell the tracker you are done; the tracker caches the matching services internally, and clears them as they are unregistered. When you have finished using the tracker, use the serviceTracker.close() method to close it.

Example

The following example shows how to use a ServiceTracker object to track a service:

package com.ibm.foo.tracker;

import com.ibm.foo.simple.Foo;
import org.osgi.framework.BundleContext;
import org.osgi.util.tracker.ServiceTracker;

/**
 * Simplest use of a ServiceTracker to get a service
 */
public class TrackingFooUser
{

    private ServiceTracker<Foo,Foo> serviceTracker;

    public TrackingFooUser( BundleContext bundleContext )
    {
        serviceTracker = new ServiceTracker<Foo, Foo>( bundleContext, Foo.class, null );
        serviceTracker.open();
    }

    public void doFoo() {
        Foo foo = serviceTracker.getService();
        //use foo
        //no need to return it... just don't use it for long.
    }

    public void shutdown() {
        serviceTracker.close();
    }
}