본문 바로가기
안드로이드 스튜디오 앱 개발/실제 앱 개발 과정

[Android Studio] 액티비티 전환 시 예약된 진동(스케줄러 취소하기)취소하기

by 망댕이 2023. 7. 11.
반응형

이번 포스팅에는 안드로이드 스튜디오에서 액티비티 전환을 하다 이전 액티비티에서 실행해놓은 지정된 시간에 울릴 진동이 다른 액티비티로 전환하였음에 불구하고 계속해서 진행되는 문제를 다루어 보려 합니다.

 

우선 MainActivity와 vibrationActivity가 있는데 vibrationActivity에서 vibrator를 이용하여 40초가 경과했을 경우 진동이 울리게 작동시키는 버튼 button_bomb_random을 만들어놓았습니다.

 

그리고 intent를 이용하여 vibrationActivity에서 MainActivity로 돌아갈 수 있도록 해두었습니다.

        Vibrator vibrator = (Vibrator)getSystemService(Context.VIBRATOR_SERVICE);
        //vibrator라는 진동 서비스
        button_bomb_random.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                randomTime_a = (Long.parseLong(String.valueOf(0))*60000) + (Long.parseLong(String.valueOf(40))*1000);
                //40초 짜리 시간
                button_bomb_random.setEnabled(false);
                //button_bomb_random버튼 비활성화
                countDownTimer = new CountDownTimer(randomTime_a, 1000) {
                    @Override
                    public void onTick(long l) {
                        textView_bomb.setText((l / 1000)/60 + "분" + (l / 1000)%60 + "초");
                    }

                    @Override
                    public void onFinish() {
                        textView_bomb.setText("시간 종료");
                        button_bomb_random.setEnabled(true);
                        //button_bomb_random버튼 활성화
                        vibrator.vibrate(2500);
                        //2.5초간 진동이 울리도록 설정
                    }

                };
                countDownTimer.start();
            }
        });


        //아래부터 MainActivity로 돌아가는 버튼인 button_bomb_back을 눌렀을 때
        button_bomb_back.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(getApplicationContext(), MainActivity.class);
                startActivity(intent);
                vibrator.cancel();
                //vibrator 취소
                finish();
            }
        });

 

button_bomb_back.setOnClickListener(---) 안에 있는 onClick 내부를 보면 MainActivity로 돌아갈 때 vibrator도 함께 취소하고 넘어갈 수 있도록 하였습니다.

하지만 vibrationActivity에서 40초가 경과했을 경우 진동이 울리는 버튼 button_bomb_random을 눌렀다면 MainActivity로 넘어가도 2.5초 진동이 울리는 결과는 변함이 없었습니다.

 

 

이렇게 logcat에서도 button_bomb_random을 누르고 button_bomb_back로 MainActivity로 갔다가 MainActivity에서 다시 vibrationActivity로 돌아와 button_bomb_random 버튼을 누르고 MainActivity로 간 작업을 2번 반복하고 MainActivity에서 기다리고 있었는데 button_bomb_random을 2번 누른 만큼 현재 MainActivity임에 불구하고 logcat에 진동이 울렸음을 확인할 수 있습니다.

 

        button_bomb_back.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(getApplicationContext(), MainActivity.class);
                startActivity(intent);
                vibrator.cancel();
                //vibrator 취소
                finish();
            }
        });

vibrationActivity에서 MainActivity로 넘어가는 버튼 button_bomb_back 안에 vibrator.cancel();과 액티비티를 마무리하는 finish()를 넣어도 소용이 없었습니다.

 

해결책은 생각보다 간단하였습니다. 스케줄링에 의해 vibrator가 지정된 시간에 동작을 하게 되는 게 주된 이유여서 스케줄링을 한 대상 countdowntimer부터 취소를 해주어야 했습니다.

 

        button_bomb_back.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(getApplicationContext(), MainActivity.class);
                startActivity(intent);
                vibrator.cancel();
                //vibrator 취소

                if(countdowntime != null) {
                    countdonwtimer.cancel();
                } //+추가

                finish();
            }
        });

 

if(countdowntime != null) { countdonwtimer.cancel(); }을 추가해 주면 vibrator가 동작을 하는 원인을 제거하게 되어 MainActivity에 돌아가도 vibrator가 지정된 시간에 진동을 울리지 않게 됩니다.

 

정리 | 스케줄링을 한 대상을 취소시켜 다른 동작이 지정된 시간에 작동하는 것을 막을 수 있다!!

 

추가로 궁금한 점은 댓글로 남겨주세요~!

반응형