2010-10-08 3 views
4

Я пытаюсь запустить службу android из класса службы. Причина этого заключается в том, чтобы добиться определенной независимости от платформы.startService() из самого класса сервиса

Выполнение этого Я получаю исключение NullPointerException в android.content.ContextWrapper.startService (ContextWrapper.java:326). Цель платформы - 2.1-update1, любые предложения?

Смотрите ниже код (я оставил импорт, чтобы сэкономить место)

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

ответ

9

Конечно - ваш вновь созданный сервис не имеет ссылку на контекст, поэтому контекст null и, следовательно, система выбрасывает NullPointerException. Помните: не создавайте службу самостоятельно, используя new - система делает это за вас!

3

UnusualService распространяется Service. Сервис распространяется ContextWrapper, который содержит Context. Итак, когда вы звоните UnusualService.startService(new Intent("...")), он на самом деле звонит ContextWrapper.startService(), который звонит context.startService(). Однако в этой точке контекст имеет значение null, и происходит NullPointerException.

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

сделать это вместо того, чтобы ...

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

Edit: Исправленная согласно КИПР

Смежные вопросы