Как написать класс для чтения значения датчика в Android

Я новичок в Android. Я хочу прочитать значение датчика, такого как акселерометр и гироскоп. Я прочитал учебник на веб-сайте и обнаружил, что он должен использовать SensorEventListener.

public class MainActivity extends Activity implements SensorEventListener{...}

Но я хочу написать класс для чтения значений датчиков, а скорее, в MainActivity, поскольку кажется, что запись в Main не соответствует правилам «Разработка программного обеспечения». Можно ли написать, как показано ниже:

public class DataCollection implements SensorEventListener{...}

И использовать MainActivity для вызова DataCollection для считывания значения датчика и возврата в MainActivity?

Может ли кто-нибудь помочь мне, пожалуйста?


person user2753594    schedule 12.09.2013    source источник


Ответы (1)


Я предполагаю, что вы прочитали это.

Таким образом, вы можете отделить SensorEventListener от вашей MainActivity. Вам просто нужно правильно зарегистрировать своего слушателя в MainActivity (замените «это» на ваш объект DataCollection):

mSensorManager.registerListener(yourDataCollectionObject, mLight, SensorManager.SENSOR_DELAY_NORMAL);

и вы также должны отменить его регистрацию:

mSensorManager.unregisterListener(yourDataCollectionObject);

Он должен работать правильно.

РЕДАКТИРОВАТЬ: вы можете попробовать это таким образом.

public class MainActivity extends Activity{

    DataCollection mDataCollection = null;

    @Override
    public final void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mDataCollection = new DataCollection(this);
    }

    @Override
    protected void onResume(){
        super.onResume();
        mDataCollection.register();
    }

    @Override
    protected void onPause(){
        super.onPause();
        mDataCollection.unregister();
    }
}

public class DataCollection implements SensorEventListener{

    private SensorManager mSensorManager;
    private Sensor mLight;

    public DataCollection(Context context){
        mSensorManager = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE);
        mLight = mSensorManager.getDefaultSensor(Sensor.TYPE_LIGHT);
    }

    @Override
    public void onAccuracyChanged(Sensor arg0, int arg1){
        // TODO

    }

    @Override
    public void onSensorChanged(SensorEvent arg0){
        // TODO

    }

    public void register(){
        mSensorManager.registerListener(this, mLight, SensorManager.SENSOR_DELAY_NORMAL);
    }

    public void unregister(){
        mSensorManager.unregisterListener(this);
    }
}
person Brtle    schedule 12.09.2013
comment
Спасибо за ответ. В классе DataCollection мне нужно сделать этот оператор setContentView (R.layout.main)? - person user2753594; 12.09.2013
comment
Нет, у вас нет (это используется для отображения пользовательского интерфейса). Более того, onCreate используется в активности, а не в слушателе. Вы должны использовать обычный конструктор. - person Brtle; 12.09.2013
comment
Но в классе (SensorManager) getSystemService (Context.SENSOR_SERVICE); у getSystemService есть ошибка, так как класс не распространяется на Activity - person user2753594; 12.09.2013
comment
Я отредактировал свой ответ. getSystemService нужно вызывать из Context. Activity является продолжением Context, так что вы можете вызывать getSystemService непосредственно в Activity. Чтобы использовать getSystemService в DataCollection, поместите контекст в конструктор. - person Brtle; 12.09.2013
comment
Я хочу показать значение датчика в текстовом представлении, как передать значения обратно в действие? - person user2753594; 24.09.2013
comment
Вы можете создать интерфейс DataCollectionListener, содержащий метод onSensorChanged(SensorEvent arg0). Затем ваш Activity реализует этот интерфейс, и вы можете обновить свой TextView в методе onSensorChanged. - person Brtle; 24.09.2013
comment
Работает ли это, если в действие передается более одного класса данных, есть ли какой-либо метод, например делегат - person user2753594; 25.09.2013
comment
Я думаю, что это работает с более чем одним классом, но я не знаю, есть ли такой метод, как делегат, извините. - person Brtle; 25.09.2013
comment
Нужен способ иметь объект Sensor в другом классе без активности, это решение было таким. Спасибо! +1 - person yiwei; 10.01.2015