在 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 可以被抛出。

由于 ServiceContextWrapper 的子类,而 ContextWrapper 又是 Context 的子类,因此您不需要将 Context 传递到构造函数中你的 AccelerometerBackgroundService。

但是您只能在构造函数代码执行后才能利用这种关系。因此,如果您在 onCreate() 中调用 Context 方法 getSystemService(),那么一切都应该按预期工作。