在 Service class 上调用 getSystemService 时出现空指针异常
Null pointer exception when calling getSystemService on Service class
在我的主 activity 中,我启动了一项服务。在该服务中,我尝试获取传感器管理器,但出现以下异常
Attempt to invoke virtual method 'java.lang.Object android.content.Context.getSystemService(java.lang.String)' on a null object reference.
如果我尝试在 activity class 中获取传感器管理器,则不会发生错误,它只会在服务 class.
中发生
这是我的主activityclass:
public class MainActivity extends AppCompatActivity
{
GridLayout mainGrid;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Intent intent = new Intent(MainActivity.this, accelerometerBackgroundService.class);
startService(intent);
mainGrid = (GridLayout) findViewById(R.id.mainGrid);
//Set Event
setSingleEvent(mainGrid);
// setToggleEvent(mainGrid);
}
...
}
这是我的服务class:
public class accelerometerBackgroundService extends Service implements SensorEventListener
{
//We need to log our activity to check what happens
private static final String TAG = "Accelerometer_Activity";
private SensorManager mSensorManager; //defining a sensor manager and the accelerometer
private Sensor accelerometer;
public accelerometerBackgroundService()
{
Log.i(TAG, "GOT HERE 100");
//getting the sensor manager services
mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
//getting the accelerometer sensor
accelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
if(accelerometer != null)
{
//If accelerometer sensor is available, create a listener
mSensorManager.registerListener(this,mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_NORMAL);
}
else
{
String noAccelError = "This device does not support accelerometer sensor!";
}
}
...
}
我想这与上下文有关。我已经搜索过类似的问题,但没有帮助我。
谢谢。
您应该将初始化代码移到 Service#onCreate()
而不是其构造函数中。
因此,重写 Service
的方法 onCreate()
,您就可以访问它的 Context
。
此外,由于 Android 框架需要 Service
上的空构造函数,因此您不应在 Service
的构造函数中传递参数,否则 java.lang.InstantiationException
可以被抛出。
由于 Service
是 ContextWrapper
的子类,而 ContextWrapper
又是 Context
的子类,因此您不需要将 Context
传递到构造函数中你的 AccelerometerBackgroundService。
但是您只能在构造函数代码执行后才能利用这种关系。因此,如果您在 onCreate()
中调用 Context
方法 getSystemService()
,那么一切都应该按预期工作。
在我的主 activity 中,我启动了一项服务。在该服务中,我尝试获取传感器管理器,但出现以下异常
Attempt to invoke virtual method 'java.lang.Object android.content.Context.getSystemService(java.lang.String)' on a null object reference.
如果我尝试在 activity class 中获取传感器管理器,则不会发生错误,它只会在服务 class.
中发生这是我的主activityclass:
public class MainActivity extends AppCompatActivity
{
GridLayout mainGrid;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Intent intent = new Intent(MainActivity.this, accelerometerBackgroundService.class);
startService(intent);
mainGrid = (GridLayout) findViewById(R.id.mainGrid);
//Set Event
setSingleEvent(mainGrid);
// setToggleEvent(mainGrid);
}
...
}
这是我的服务class:
public class accelerometerBackgroundService extends Service implements SensorEventListener
{
//We need to log our activity to check what happens
private static final String TAG = "Accelerometer_Activity";
private SensorManager mSensorManager; //defining a sensor manager and the accelerometer
private Sensor accelerometer;
public accelerometerBackgroundService()
{
Log.i(TAG, "GOT HERE 100");
//getting the sensor manager services
mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
//getting the accelerometer sensor
accelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
if(accelerometer != null)
{
//If accelerometer sensor is available, create a listener
mSensorManager.registerListener(this,mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_NORMAL);
}
else
{
String noAccelError = "This device does not support accelerometer sensor!";
}
}
...
}
我想这与上下文有关。我已经搜索过类似的问题,但没有帮助我。
谢谢。
您应该将初始化代码移到 Service#onCreate()
而不是其构造函数中。
因此,重写 Service
的方法 onCreate()
,您就可以访问它的 Context
。
此外,由于 Android 框架需要 Service
上的空构造函数,因此您不应在 Service
的构造函数中传递参数,否则 java.lang.InstantiationException
可以被抛出。
由于 Service
是 ContextWrapper
的子类,而 ContextWrapper
又是 Context
的子类,因此您不需要将 Context
传递到构造函数中你的 AccelerometerBackgroundService。
但是您只能在构造函数代码执行后才能利用这种关系。因此,如果您在 onCreate()
中调用 Context
方法 getSystemService()
,那么一切都应该按预期工作。