我一直在阅读,并且已经看到无法立即访问系统服务;在调用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()应该被调用...]
答案 0 :(得分:3)
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类本身实现了事件监听器,所以你将传递你的实例。