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

Android 安卓:我可以在没有活动的情况下访问系统服务吗?,android,android-activity,accelerometer,sensors,Android,Android Activity,Accelerometer,Sensors,我一直在阅读并看到系统服务无法直接访问;必须在调用onCreate()后访问它们 我正在创建一个键盘服务,但我想访问系统服务,如传感器。有没有一种方法可以让我不用活动就可以做到这一点 我已经尝试让我的类继承InputMethodService并实现SensorEventListener。我实现了onSensorChanged()方法,并告诉它打印到logcat,但它从未被调用。我有一个方法onCreateInputView(),其中定义了传感器管理器和加速计: public class MyIn

我一直在阅读并看到系统服务无法直接访问;必须在调用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源自上下文,因此,应调用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,但它从未被调用。然后,您可能应该将其与最低版本(已测试!)的代码一起放在您的问题中。现在,你似乎在问你是否可以获得系统服务,除非你从那个调用中得到一个空结果,否则你似乎可以。该死的,我知道这很简单。。。非常感谢您抽出时间来发现这一点!该死,我就知道这很简单。。。非常感谢您抽出时间来发现这一点!