Почему мой датчик ускорения продолжает работать после закрытия упражнения? - PullRequest
0 голосов
/ 11 октября 2018

Я разрабатываю приложение, которое использует датчик ускорения для перемещения шара по экрану.Я нарисовал шар, используя Canvas , и каждый раз, когда рисунок «касался» конца экрана, показывалось сообщение, сообщающее пользователю соответствующую сторону.

Как показано в следующемimage:

enter image description here

Тост показывает сообщение: «движение влево», переведенное с испанского на английский язык.

Вы видитечто сообщение отображается правильно.

Проблема возникает, когда я нажимаю на кнопку возврата телефона:

Ваши симптомы:

  • Сообщение изображенияснова отображается в зависимости от ориентации телефона.
  • Сообщения, по-видимому, циклические, то есть, даже если вы не двигаетесь, сообщения являются случайными.

enter image description here enter image description here

Сообщения Toast ведут себя так, как будто они все еще были в предыдущем действии, то есть из которого я ушел.Иногда он показывает предупреждение только тогда, когда я перемещаю телефон, а в другое время, не перемещая его несколько раз и случайным образом.

Ручная кнопка главного экрана - это та, которая направляет вид на Активность первой фотографии смяч.

Хотя в этом представлении нажмите кнопку возврата, сообщение продолжает отображаться даже после того, как я вернулся на экран своих приложений.

Единственный способ устранить эту проблему - удалить приложение избанк приложений и процесс снова совпадают.

Я подчеркиваю, что проблема возникает только тогда, когда я вхожу в это представление и возвращаюсь, пока этого не произошло.

Я прикрепляю основной код:

btnManual.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                Intent intent = new Intent(MainActivity.this, MovimientoActivity.class);
                startActivity(intent);                       
            }

Однажды в MovimientoActivity.class

   public class MovimientoActivity extends AppCompatActivity{

        private DrawView view;  //Class where the ball is created with the accelerometer

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);

            Toast.makeText(this, "Cliclo-onCreate", Toast.LENGTH_SHORT).show();


            DisplayMetrics displaymetrics = new DisplayMetrics();
            getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);

            view = new DrawView(this, displaymetrics); //Se llama a esa vista
            view.setBackgroundColor(Color.parseColor("#F5B041"));
            setContentView(view);

            //Definimos usar toda la pantalla
            getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                    WindowManager.LayoutParams.FLAG_FULLSCREEN);

        }
    }
                });

Class DrawView.java

public class DrawView extends View implements SensorEventListener {

    Cliente cliente = null;

    Sensor accelerometer = null;
    SensorManager manager;

    static String TAG = "DrawView";

    int BLOQUEO_ARRIBA = 0;
    int BLOQUEO_ABAJO = 0;
    int BLOQUEO_DERECHO = 0;
    int BLOQUEO_IZQUIERDO = 0;

    private Bitmap pelota;

    public int ALTURA;

    public int ANCHO;
    DisplayMetrics displaymetrics;

    Punto posicion = new Punto();

    final int X = 0;
    final int Y = 1;
    final int Z = 2;

    public DrawView(Context context, DisplayMetrics displaymetrics) {
        super(context);

        this.displaymetrics = displaymetrics;
        manager = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE);

        if (manager.getSensorList(Sensor.TYPE_ACCELEROMETER).size() != 0) {

            accelerometer = manager.getSensorList(
                    Sensor.TYPE_ACCELEROMETER).get(0);
                    if (!manager.registerListener(this, accelerometer,
                    SensorManager.SENSOR_DELAY_FASTEST)) {
            }
        }

        try {
            AssetManager assetManager = context.getAssets();
            InputStream inputStream;
            inputStream = assetManager.open("bola_2.png");
            pelota = BitmapFactory.decodeStream(inputStream);
        } catch (IOException e) {
            e.printStackTrace();
        }

        // Obtenemos las medidas de la pantalla
        ALTURA = displaymetrics.heightPixels;
        ANCHO = displaymetrics.widthPixels;
    }
    @Override
    public void onSensorChanged(SensorEvent event) {
        // Modificamos la posicion de la bola en el eje X

        posicion.x -= event.values[X];
        //Comprobamos si se sale de la pantalla, y en ese caso, modificamos su valor
        if (posicion.x < 0) {

            if(BLOQUEO_IZQUIERDO == 0){
                Log.i(TAG, "onSensorChanged: izquierdo");
                Toast.makeText(getContext(), "Movimiento a la izquierda", Toast.LENGTH_SHORT).show();

                BLOQUEO_DERECHO = 0;
                BLOQUEO_ARRIBA = 0;
                BLOQUEO_ABAJO = 0;

                BLOQUEO_IZQUIERDO++;
            }

            posicion.x = 0;
        }else if (posicion.x > this.ANCHO -pelota.getWidth()) {

            if(BLOQUEO_DERECHO == 0){
                Log.i(TAG, "onSensorChanged: derecho");
                Toast.makeText(getContext(), "Movimiento a la derecha", Toast.LENGTH_SHORT).show();                        
                BLOQUEO_IZQUIERDO = 0;
                BLOQUEO_ARRIBA = 0;
                BLOQUEO_ABAJO = 0;

                BLOQUEO_DERECHO++;
            }

            posicion.x = this.ANCHO - pelota.getWidth();
        }
        //Modificamos la posicion de la bola en el eje Y
        posicion.y += event.values[Y];
        //Comprobamos si se sale de la pantalla, y en ese caso, modificamos su valor
        if (posicion.y < 0) {

            if(BLOQUEO_ARRIBA == 0){
                Log.i(TAG, "onSensorChanged: arriba");
                Toast.makeText(getContext(), "Movimiento hacia arriba", Toast.LENGTH_SHORT).show();

                BLOQUEO_DERECHO = 0;
                BLOQUEO_IZQUIERDO = 0;
                BLOQUEO_ABAJO = 0;

                BLOQUEO_ARRIBA++;
            }
            posicion.y = 0;

        }else if (posicion.y > this.ALTURA - pelota.getHeight()) {

            if(BLOQUEO_ABAJO == 0){
                Log.i(TAG, "onSensorChanged: abajo");
                Toast.makeText(getContext(), "Movimiento hacia abajo", Toast.LENGTH_SHORT).show();                        
                BLOQUEO_DERECHO = 0;
                BLOQUEO_ARRIBA = 0;
                BLOQUEO_IZQUIERDO = 0;

                BLOQUEO_ABAJO++;
            }

            posicion.y = this.ALTURA - pelota.getHeight();
        }
        //Método invalidate para llamar onDraw
        invalidate();


    }

    @Override
    public void onDraw(Canvas canvas) {
        canvas.drawBitmap(pelota, posicion.x, posicion.y, null);
    }    
    @Override
    public void onAccuracyChanged(Sensor sensor, int accuracy) {    
    }        
}

Переменные, которые я объявил как BLOQUEO, потому что мне нужен только датчик, чтобы сообщить мне о событии один раз, так что если онЯ выполню другое действие, пока другой конец не будет «затронут».

Ну, пока это проблема.В конце концов, моя цель - не дать сенсору продолжать работать после снятия экрана мяча или если он перестает работать в фоновом режиме, если в этом проблема.

Я ценю помощь, которую вы можете оказатья.

Ответы [ 2 ]

0 голосов
/ 11 октября 2018

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

public class DrawView extends View implements SensorEventListener {

Cliente cliente = null;

Sensor accelerometer = null;
public SensorManager manager;
...
}

теперь отмените регистрацию слушателей в MovimientoActivity onPause ():

protected void onPause() {
     super.onPause();
     if(view!=null)if(view.manager!=null)view.manager.unregisterListener(view);
 }
0 голосов
/ 11 октября 2018

Вам необходимо отменить регистрацию слушателя в SensorManager при выходе из приложения / действия.Для этого вы должны переопределить метод onDestroy в вашей деятельности.см. эту страницу для всех методов https://developer.android.com/reference/android/hardware/SensorManager

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...