Я читал и видел, что к системным службам нельзя получить доступ сразу; они должны быть доступны после вызова 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
mino 21 Фев 2014 в 21:04
1
Интересный вопрос. InputMethodService также наследуется от Context, поэтому метод getSystemService () должен как минимум существовать, и у него есть метод жизненного цикла onCreate (). Что произойдет, если вы попытаетесь получить желаемую услугу с помощью этого контекста после вызова onCreate ()?
 – 
Chris Stratton
21 Фев 2014 в 21:11
Хорошо, так где же код, который настраивает для обновлений, и метод события, который не запускается? На данный момент коллективное убеждение в том, что то, что вы хотите сделать, возможно , поэтому проблема в вашей попытке, и мы не можем помочь с этим, не видя, что именно вы пытаетесь сделать. заставить только это работать.
 – 
Chris Stratton
21 Фев 2014 в 22:22
Прилагается то, с чем я имею дело
 – 
mino
21 Фев 2014 в 22:33
Прочтите документ. getSystemService - это метод из Context. Любые правильно инициализированные (т.е. действия или службы после их запуска) подойдут.
 – 
njzk2
21 Фев 2014 в 22:36
1
Вы никогда не звоните mSensorManager.registerListener?
 – 
njzk2
21 Фев 2014 в 22:48

2 ответа

Лучший ответ

Вы должны не только получить свои услуги, но и зарегистрировать прослушиватель событий.

См., Например, следующий раздел из проекта ApiDemos (устаревших) образцов SDK:

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

В вашем случае это сам ваш класс MyInput, который реализует прослушиватель событий, поэтому вместо этого вы передадите свой экземпляр.

2
Chris Stratton 21 Фев 2014 в 22:47
Черт возьми, я знал, что это будет что-то простое ... Большое спасибо, что нашли время, чтобы это заметить!
 – 
mino
21 Фев 2014 в 22:58

getSystemService() можно вызвать в любом экземпляре Context, и поскольку InputMethodService отслеживает свое происхождение до Context, вы можете получить доступ к системе сервисов в нем, если ваш вызов находится после метода onCreate().

Это работает так же, как при использовании акселерометра из фоновой службы. Наличие видимого Activity не является обязательным требованием для доступа к системным сервисам.

3
Raghav Sood 21 Фев 2014 в 21:26
На самом деле это именно то, чем я хочу заниматься. Я хочу получить доступ к акселерометру. Однако как вы можете быть уверены, что был вызван onCreate ()?
 – 
mino
21 Фев 2014 в 21:29
1
Вы можете установить логический флаг в теле метода вашей реализации onCreate. Но обычно, если доступ к вашей системной службе находится внутри тела метода в вашем InputMethodService, он будет вызываться после onCreate (если это не статический метод, вызываемый извне)
 – 
Raghav Sood
21 Фев 2014 в 21:32
Это все еще не работает. У меня есть класс, наследующий InputMethodService и реализующий SensorEventListener. Я реализую метод onSensorChanged () и приказываю ему печатать в logcat, но он никогда не вызывается.
 – 
mino
21 Фев 2014 в 21:48
1
Тогда вам, вероятно, следует указать это в своем вопросе вместе с минимальной (протестированной!) Версией кода. Прямо сейчас, похоже, вы спрашиваете, можете ли вы даже получить системную службу, и если вы не получаете нулевой результат от этого вызова, похоже, что вы можете.
 – 
Chris Stratton
21 Фев 2014 в 22:02