2010-10-08 4 views
4

Je tente de démarrer un service android à partir de la classe du service. La raison pour cela est d'obtenir une certaine indépendance de la plate-forme. Cela fait que j'obtiens une exception NullPointerException sur android.content.ContextWrapper.startService (ContextWrapper.java:326). La cible de la plateforme est 2.1-update1, des suggestions?startService() de la classe de service elle-même

Voir le code ci-dessous (je laisse les importations pour sauver un peu d'espace)

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

Répondre

9

Bien sûr - votre service nouvellement créé n'a pas de référence à un contexte, de sorte que le contexte est null et donc la le système lance un NullPointerException. Rappelez-vous: ne créez pas un service par vous-même en utilisant new - le système le fait pour vous!

3

Votre UnusualService s'étend Service. Le service s'étend ContextWrapper qui contient Context. Ainsi, lorsque vous appelez UnusualService.startService(new Intent("...")), il appelle ContextWrapper.startService() qui appelle context.startService(). Cependant, à ce stade, le contexte est nul et NullPointerException se produit.

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

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

faire à la place ...

startService(new Intent(UnusualService.this, UnusualService.class)); 

Edit: Correction selon CHYPRE

Questions connexes