tags:

views:

54

answers:

2

Hi! I try to start an android service from the service's class. The reason to do this is to achieve some platform independence.

Doing this I get a NullPointerException at android.content.ContextWrapper.startService(ContextWrapper.java:326). The platform target is 2.1-update1, any suggestions?

See the code below (I left the imports out to save some space)

/* GUI: HelloAndroid.java */
package com.example.helloandroid;

public class HelloAndroid extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        // that works!
        startService(new Intent("com.example.helloandroid.UnusualService"));

        // stop the service works of course, too
        stopService(new Intent("com.example.helloandroid.UnusualService"));

        // unusual start does not work:
        UnusualService myService = new UnusualService();
        myService.startService();
    }
}

/* Service: UnusualService.java */
package com.example.helloandroid;

public class UnusualService extends Service {    
    @Override
    public void onCreate() {
        Toast.makeText(this, R.string.service_started, Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onDestroy() {
        Toast.makeText(this, R.string.service_stopped, Toast.LENGTH_SHORT).show();
    }

    @Override
    public IBinder onBind(Intent intent) {
        return null; // make something here when the rest works 
    }

    public void startService() {
        // folowing line will cause the NullPointerException
        startService(new Intent("com.example.helloandroid.UnusualService"));
    }

    public void stopService() {
        stopSelf();
    }
}
+2  A: 

Of course - your newly created service does not have a reference to a context, so the context is null and therefore the system throws a NullPointerException. Remember: Do not create a service on your own by using new - the system does this for you!

mreichelt
A: 

Your UnusualService extends Service. Service extends ContextWrapper which contains Context. So when you call UnusualService.startService(new Intent("...")) it actually calls ContextWrapper.startService() which calls context.startService(). However at this point context is null and NullPointerException occurs.

public abstract class Service extends ContextWrapper implements ComponentCallbacks {
    private static final String TAG = "Service";

    public Service() {
        super(null);
    }

    //...
}


public class ContextWrapper extends Context {
    Context mBase;

    public ContextWrapper(Context base) {
        mBase = base;
    }

    @Override
    public ComponentName startService(Intent service) {
        return mBase.startService(service);
    }

    //...
}
cement