Android 安卓:我可以在没有活动的情况下访问系统服务吗?
我一直在阅读并看到系统服务无法直接访问;必须在调用onCreate()后访问它们 我正在创建一个键盘服务,但我想访问系统服务,如传感器。有没有一种方法可以让我不用活动就可以做到这一点 我已经尝试让我的类继承InputMethodService并实现SensorEventListener。我实现了onSensorChanged()方法,并告诉它打印到logcat,但它从未被调用。我有一个方法onCreateInputView(),其中定义了传感器管理器和加速计:Android 安卓:我可以在没有活动的情况下访问系统服务吗?,android,android-activity,accelerometer,sensors,Android,Android Activity,Accelerometer,Sensors,我一直在阅读并看到系统服务无法直接访问;必须在调用onCreate()后访问它们 我正在创建一个键盘服务,但我想访问系统服务,如传感器。有没有一种方法可以让我不用活动就可以做到这一点 我已经尝试让我的类继承InputMethodService并实现SensorEventListener。我实现了onSensorChanged()方法,并告诉它打印到logcat,但它从未被调用。我有一个方法onCreateInputView(),其中定义了传感器管理器和加速计: public class MyIn
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源自上下文,因此,应调用onCreate()。]getSystemService()
可以在的任何实例上调用,并且由于可以将其起源追溯到上下文,只要调用在onCreate()之后,您就可以访问其中的系统服务
方法
这就像从后台服务使用加速计一样。拥有可见的活动不是访问系统服务的要求。getSystemService()
可以在的任何实例上调用,并且由于可以将其起源追溯到上下文,因此只要调用在onCreate()
方法之后,您就可以访问其中的系统服务
这就像从后台服务使用加速计一样。拥有可见的活动不是访问系统服务的要求。您不仅要获得服务,还要注册事件侦听器 例如,请参见(遗留)SDK示例的ApiDemos项目中的以下部分:
mSensorManager.registerListener(mGraphView,
SensorManager.SENSOR_ACCELEROMETER |
SensorManager.SENSOR_MAGNETIC_FIELD |
SensorManager.SENSOR_ORIENTATION,
SensorManager.SENSOR_DELAY_FASTEST);
在您的例子中,是MyInput类本身实现了事件侦听器,因此您可以传递该类的实例 您不仅要获得服务,还要注册事件侦听器 例如,请参见(遗留)SDK示例的ApiDemos项目中的以下部分:
mSensorManager.registerListener(mGraphView,
SensorManager.SENSOR_ACCELEROMETER |
SensorManager.SENSOR_MAGNETIC_FIELD |
SensorManager.SENSOR_ORIENTATION,
SensorManager.SENSOR_DELAY_FASTEST);
在您的例子中,是MyInput类本身实现了事件侦听器,因此您可以传递该类的实例 有趣的问题。InputMethodService也从上下文继承,因此getSystemService()方法至少应该存在,并且它有一个onCreate()生命周期方法。调用onCreate()后,如果尝试使用此上下文获取所需的服务,会发生什么情况?好的,那么设置更新的代码和未触发的事件方法在哪里?在这一点上,大家的共同信念似乎是,你想做的是可能的,因此问题在于你的尝试,我们无法帮助你,如果你不清楚你想做什么来让这一切顺利进行的话。@ChrisStratton附件是我要处理的阅读文件。getSystemService是来自上下文的方法。任何正确初始化(即活动或服务启动后)都可以。您永远不会调用
mSensorManager.registerListener
?有趣的问题。InputMethodService也从上下文继承,因此getSystemService()方法至少应该存在,并且它有一个onCreate()生命周期方法。调用onCreate()后,如果尝试使用此上下文获取所需的服务,会发生什么情况?好的,那么设置更新的代码和未触发的事件方法在哪里?在这一点上,大家的共同信念似乎是,你想做的是可能的,因此问题在于你的尝试,我们无法帮助你,如果你不清楚你想做什么来让这一切顺利进行的话。@ChrisStratton附件是我要处理的阅读文件。getSystemService是来自上下文的方法。任何正确初始化(即启动后的活动或服务)都可以。您从不调用mSensorManager.registerListener
?这正是我想要做的。我想进入加速计。但是,如何确保已调用onCreate()@mino您可以在onCreate实现的方法体中设置一个布尔标志。但通常,如果您的系统服务访问位于InputMethodService中的方法体内部,那么它将在onCreate之后被调用(除非它是从外部调用的静态方法),这似乎仍然不起作用。我让我的类继承InputMethodService并实现SensorEventListener。我实现了onSensorChanged()方法,并告诉它打印到logcat,但它从未被调用。然后,您可能应该将其与最低版本(已测试!)的代码一起放在您的问题中。现在,你似乎在问你是否可以获得系统服务,除非你从那个调用中得到一个空结果,否则你似乎可以。这正是我想要做的。我想进入加速计。但是,如何确保已调用onCreate()@mino您可以在onCreate实现的方法体中设置一个布尔标志。但通常,如果您的系统服务访问位于InputMethodService中的方法体内部,那么它将在onCreate之后被调用(除非它是从外部调用的静态方法),这似乎仍然不起作用。我让我的类继承InputMethodService并实现SensorEventListener。我实现了onSensorChanged()方法,并告诉它打印到logcat,但它从未被调用。然后,您可能应该将其与最低版本(已测试!)的代码一起放在您的问题中。现在,你似乎在问你是否可以获得系统服务,除非你从那个调用中得到一个空结果,否则你似乎可以。该死的,我知道这很简单。。。非常感谢您抽出时间来发现这一点!该死,我就知道这很简单。。。非常感谢您抽出时间来发现这一点!