NullPointerException en el constructor de Service

En mi proyecto de Android, tengo un Service :

 public class MyService extends Service{ //I defined a explicite contructor public MyService(){ //NullPointerException here, why? File dir = getDir("my_dir", Context.MODE_PRIVATE); } @Override public void onCreate(){ super.onCreate(); ... } @Override public int onStartCommand(Intent intent, int flags, int startId) { super.onStartCommand(intent, flags, startId); ... } } 

Sé que normalmente, no debería definir explícitamente un constructor para Android Service . Pero en mi caso, quiero usar el constructor para crear un directorio en mi almacenamiento interno.

Cuando lo intento, tengo NullPointerException , que no entiendo por qué? ¿Podría alguien explicarme la razón por la que me NullPoineterException cuando llamar a getDir(...) en mi constructor explicite?

getDir() es un método en Context .

El servicio no está configurado para ser utilizado como Context hasta onCreate() .

Básicamente, el marco establece servicios (y actividades para el caso) de la siguiente manera:

  1. Crear el objeto
  2. Configurar el Context , con recursos adecuados para la configuración actual
  3. Llamar onCreate() en el objeto

No puede hacer nada que requiera que el objeto sea un Context configurado correctamente en el paso 1, es decir, durante la inicialización o el constructor de la variable miembro.

Debe utilizar la función de ciclo de vida del servicio onCreate (). La función onCreate se ejecuta sólo una vez en un ciclo de vida de servicio y funciona como constructor. Si desea que se actualice en cualquier lugar, puede ponerlo en onStartCommand (intención intención, int flags, int startId).

Probablemente Contexto sigue siendo nulo en su constructor de servicio, y getDir está utilizando Context para sus operaciones internas. Puede comprobarlo en las siguientes fuentes:

http://androidxref.com/4.4.2_r1/xref/frameworks/base/core/java/android/content/ContextWrapper.java#244

 243 @Override 244 public File getDir(String name, int mode) { 245 return mBase.getDir(name, mode); 246 } 

Así que si mBase es nulo entonces obtendrás NPE

MBase se establecerá en constructor:

 56 public ContextWrapper(Context base) { 57 mBase = base; 58 } 

El servicio extiende ContextWrapper, pero el constructor de servicio está llamando directamente a este constructor con valor nulo:

http://androidxref.com/4.4.2_r1/xref/frameworks/base/core/java/android/app/Service.java#294

 294 public Service() { 295 super(null); 296 } 

Por lo que debe esperar a Service.onCreate (), o (si es posible) utilizar algún Contexto globalmente conocido como desde su objeto de aplicación.

Como @laalto dijo El servicio no está configurado para ser utilizado como un Contexto hasta onCreate () ..

Así que haga una variable global de Contexto .

 Context ctx; 

También hacer Constructor para su clase MyService debe ser.

 public MyService(Context mContext){ this.ctx = mContext; File dir = ctx.getDir("my_dir", Context.MODE_PRIVATE); } 
  • Usuario apropiado del servicio de fondo / receptor de difusión
  • Android ResultReceiver a través de paquetes
  • No se puede realizar la sincronización (onPerformSync no se llama)
  • Servicio enlazado de Android: ¿debo reconectar manualmente en onServiceDisconnected o intento reconectar automáticamente?
  • Cómo activar Internet continuamente en modo doze Marshmallow and Nougat
  • Cómo crear una aplicación de Android que se activa en eventos de sacudidas cuando la pantalla está bloqueada?
  • Las siguientes llamadas onBind () no se activan
  • ¿Debo hacer el trabajo en un hilo separado si mi aplicación Android no tiene interfaz de usuario?
  • ¿Es correcto llamar a Service.startService () desde Service.onBind ()?
  • BroadcastReceiver intentando devolver el resultado durante una transmisión no ordenada - PACKAGE_ADDED en Android
  • ¿Cómo implemento un BroadcastReceiver en una clase de servicio en Android?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.