【问题标题】:Android: Can I access system services without an Activity?Android:我可以在没有 Activity 的情况下访问系统服务吗?
【发布时间】:2014-03-23 08:00:51
【问题描述】:

我一直在阅读并看到无法立即访问系统服务;必须在调用 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() 应该被调用...]

【问题讨论】:

  • 有趣的问题。 InputMethodService 也继承自 Context,所以 getSystemService() 方法至少应该存在,并且它有一个 onCreate() 生命周期方法。如果你在 onCreate() 被调用后尝试使用这个 Context 获取你想要的服务会发生什么?
  • 好的,设置更新的代码在哪里,没有触发的事件方法在哪里?在这一点上,集体信念似乎是您想要做的事情是可能的,因此问题出在您的尝试上,如果没有看到您正在尝试做什么,我们将无能为力让就这样工作。
  • @ChrisStratton 附件是我正在处理的
  • 阅读文档。 getSystemService 是来自 Context 的方法。任何正确初始化(即启动后的活动或服务)都可以。
  • 你从来没有给mSensorManager.registerListener打电话?

标签: android android-activity accelerometer sensors


【解决方案1】:

getSystemService() 可以在Context 的任何实例上调用,并且由于InputMethodService 可以追溯到上下文,因此您可以访问其中的系统服务,只要您的调用在onCreate() 之后方法。

这就像您从后台服务使用加速度计一样。拥有可见的 Activity 并不是访问系统服务的必要条件。

【讨论】:

  • 这实际上正是我想要做的。我想访问加速度计。但是,如何确定 onCreate() 已被调用?
  • @mino 您可以在 onCreate 实现的方法主体中设置一个布尔标志。但一般来说,如果你的系统服务访问是在你的InputMethodService中的方法体内部,它会在onCreate之后调用(除非是从外部调用的静态方法)
  • 这似乎仍然不起作用。我让我的类继承 InputMethodService 并实现 SensorEventListener。我实现了 onSensorChanged() 方法并告诉它打印到 logcat 但它从未被调用。
  • 那么您可能应该将其与代码的最小(经过测试!)版本一起放在您的问题中。现在,您似乎在询问您是否甚至可以获得系统服务,除非您从该调用中获得空结果,否则您似乎可以。
【解决方案2】:

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

请参阅(旧版)SDK 示例的 ApiDemos 项目中的以下部分:

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

在您的情况下,是您的 MyInput 类本身实现了事件侦听器,因此您将传递您的实例。

【讨论】:

  • 该死,我就知道这很简单...非常感谢您抽出宝贵时间发现这个!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-14
  • 2016-02-22
  • 2016-06-27
  • 1970-01-01
  • 1970-01-01
  • 2012-03-19
  • 2017-02-04
相关资源
最近更新 更多