Я читал и видел, что к системным службам нельзя получить доступ сразу; они должны быть доступны после вызова 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 () должен вызываться ...]
2 ответа
Вы должны не только получить свои услуги, но и зарегистрировать прослушиватель событий.
См., Например, следующий раздел из проекта ApiDemos (устаревших) образцов SDK:
mSensorManager.registerListener(mGraphView,
SensorManager.SENSOR_ACCELEROMETER |
SensorManager.SENSOR_MAGNETIC_FIELD |
SensorManager.SENSOR_ORIENTATION,
SensorManager.SENSOR_DELAY_FASTEST);
В вашем случае это сам ваш класс MyInput, который реализует прослушиватель событий, поэтому вместо этого вы передадите свой экземпляр.
getSystemService()
можно вызвать в любом экземпляре Context, и поскольку InputMethodService отслеживает свое происхождение до Context, вы можете получить доступ к системе сервисов в нем, если ваш вызов находится после метода onCreate()
.
Это работает так же, как при использовании акселерометра из фоновой службы. Наличие видимого Activity не является обязательным требованием для доступа к системным сервисам.
Похожие вопросы
Новые вопросы
android
Android — это мобильная операционная система Google, используемая для программирования или разработки цифровых устройств (смартфонов, планшетов, автомобилей, телевизоров, одежды, очков, IoT). Для тем, связанных с Android, используйте теги, специфичные для Android, такие как android-intent, android-activity, android-adapter и т. д. Для вопросов, отличных от разработки или программирования, но связанных с Android framework, используйте эту ссылку: https://android .stackexchange.com.
mSensorManager.registerListener
?