Android:我可以在没有活动的情况下访问系统服务吗?

时间:2014-02-21 17:04:58

标签: android android-activity accelerometer sensor

我一直在阅读,并且已经看到无法立即访问系统服务;在调用onCreate()之后必须访问它们。

我正在创建一个键盘服务,但我想访问传感器等系统服务。有没有办法可以在没有活动的情况下做到这一点?

我已经尝试让我的类继承InputMethodService并实现SensorEventListener。我实现了onSensorChanged()方法,并告诉它打印到logcat但它永远不会被调用。我有一个onCreateInputView()方法,我在其中定义了传感器管理器和加速度计:

public class MyInput extends InputMethodService implements SensorEventListener {
    MyInputView MyInputView;
    private SensorManager mSensorManager;

    @Override
    public View onCreateInputView() {

        mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);

        final MyInputView MyInputView = (MyInputView) getLayoutInflater().inflate(R.layout.MyInput, null);

        this.MyInputView = MyInputView;

        return MyInputView;

    }

    @Override
    public void onAccuracyChanged(Sensor sensor, int accuracy) {
        // TODO Auto-generated method stub

    }

    @Override
    public void onSensorChanged(SensorEvent event) {
        // TODO Auto-generated method stub
        Log.d("called", "called");
    }

}

[基于给出的建议,InputMethodService似乎来自Context,因此,onCreate()应该被调用...]

2 个答案:

答案 0 :(得分:3)

可以在Context的任何实例上调用

getSystemService(),并且由于InputMethodService将其来源追溯到上下文,只要您的呼叫,您就可以获得对其中系统服务的访问权限在onCreate()方法之后。

这与您从后台服务使用Accelerometer时的工作方式相同。拥有可见的Activity不是访问系统服务的必要条件。

答案 1 :(得分:2)

您不仅要获得服务,还要注册您的事件监听器。

例如,参见(旧版)SDK示例的ApiDemos项目中的以下部分:

 mSensorManager.registerListener(mGraphView, 
            SensorManager.SENSOR_ACCELEROMETER | 
            SensorManager.SENSOR_MAGNETIC_FIELD | 
            SensorManager.SENSOR_ORIENTATION,
            SensorManager.SENSOR_DELAY_FASTEST);

在你的情况下,你的MyInput类本身实现了事件监听器,所以你将传递你的实例。