마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

Service와 SensorEventListener 가속도 센서 관련 코드 좀 봐주세요

0 추천
public class MyService extends Service implements SensorEventListener{

    private static final String TAG = "MyService";

    private long lastTime;
    private float speed;
    private float lastX;
    private float lastY;
    private float lastZ;
    private float x, y, z;
    int count=0;

    private static final int SHAKE_THRESHOLD = 800;
    private static final int DATA_X = SensorManager.DATA_X;
    private static final int DATA_Y = SensorManager.DATA_Y;
    private static final int DATA_Z = SensorManager.DATA_Z;

    private SensorManager sensorManager;
    private Sensor accelerormeterSensor;


    public MyService() {
    }

    public void onAccuracyChanged(Sensor sensor, int accuracy){}

    public void onSensorChanged(SensorEvent event){

        if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
            long currentTime = System.currentTimeMillis();
            long gabOfTime = (currentTime - lastTime);
            if (gabOfTime > 100) {
                lastTime = currentTime;
                x = event.values[SensorManager.DATA_X];
                y = event.values[SensorManager.DATA_Y];
                z = event.values[SensorManager.DATA_Z];

                speed = Math.abs(x + y + z - lastX - lastY - lastZ) / gabOfTime * 10000;

                if (speed > SHAKE_THRESHOLD) {
                    // 이벤트발생!!

                    count++;
                }

                lastX = event.values[DATA_X];
                lastY = event.values[DATA_Y];
                lastZ = event.values[DATA_Z];
            }

        }

    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {

        Log.d(TAG,"OnStartCommand() 호출");

        if (accelerormeterSensor != null)
            sensorManager.registerListener(this, accelerormeterSensor,
                    SensorManager.SENSOR_DELAY_GAME);

        Toast.makeText(getApplicationContext(),count,Toast.LENGTH_LONG).show();

        return super.onStartCommand(intent, flags, startId);
    }


    @Override
    public void onCreate() {
        super.onCreate();
        Log.d(TAG,"OnCreate() 호출");

        sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
        accelerormeterSensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);

    }

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }
}

 

만보기 소스로 공부 중인데요..
 
백그라운드에서 돌아가게 하기 위해서
 
엑티비티에 있던 오픈소스를 서비스로 조금 바꿔서 써봤는데요
 
안되네요..ㅠㅠ
 
초보라 그런지 잘 모르겠습니다..
 
뭐가 문제인지 봐주시면 감사하겠습니다...
 
그리고 서비스클래스에 있는 count 변수를 엑티비티에 넘겨주는 방법은 뭐가 있나요?
 
네넨에넹 (940 포인트) 님이 2015년 4월 16일 질문

1개의 답변

+1 추천
 
채택된 답변
1. 카운트 변수를 static으로 선언하거나

2. LocalBinder 를 이용하거나

3. BroadcastReceiver 컴포넌트를 이용하거나

4. interface로 리스너(또는 콜백)을 만들어서 이용하거나

....

...

기타 등등 방법은 많이 있습니다. 위 키워드로 검색하셔서 자세한 구현방법은 찾아보시길 바랍니다.

 

그리고 질문과는 별개로 위코드는 매우 위험합니다.

센서매니저로부터 registerListener 하는 부분만 있고 unregisterListener 하는 부분이 없군요
Gradler (109,780 포인트) 님이 2015년 4월 16일 답변
네넨에넹님이 2015년 4월 21일 채택됨
public void onDestroy() {
        super.onDestroy();
        Log.i(TAG,"OnDestroy() 호출");

        if (sensorManager != null)
            sensorManager.unregisterListener(this);
    }
이렇게 해봤습니다
...