How to completely end or kill an activity in android and transition to another?

176 Views Asked by At

I know this question was asked several times but I can't seem to make it work with any of the answers provided. I simply want with a click of a button to end the activity I am currently in and go to another activity. I want to delete it from the back stack as well, so I did the following in my Alert Dialog:

    private void AlertMessage()
{
    AlertDialog alertDialog = new AlertDialog.Builder(this, android.R.style.Widget_Material_ButtonBar_AlertDialog)
//set icon
            .setIcon(android.R.drawable.ic_dialog_alert)
//set title
            .setTitle("YOU ARE ABOUT TO EXIT!!!")
//set message
            .setMessage("Exiting will cancel this process")
//set positive button
            .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialogInterface, int i) {
                    //set what would happen when positive button is clicked
                    //RESETTING FIRST THEN RETURN TO MAIN MENU
                    if (Build.VERSION.SDK_INT >= 26)
                    {
//                        recreate();
//                        pb.setProgress(0);
                        Toast.makeText(tool1mode1.this, "Exit", Toast.LENGTH_SHORT).show();
                        Intent goingback = new Intent(tool1mode1.this, Settings.class);
                        goingback.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_NO_HISTORY);
                        finishAffinity();
                        tool1mode1.this.finish();
                        overridePendingTransition(R.anim.slide_in_left, R.anim.slide_out_right);
                        startActivity(goingback);
                    }
                }
            })
//set negative button
            .setNegativeButton("No", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialogInterface, int i) {
                    //set what should happen when negative button is clicked
                    Toast.makeText(getApplicationContext(),"Cancelled",Toast.LENGTH_LONG).show();
                }
            })
            .show();
}

yet when I did go to the other activity after I thought I ended the one I was in, I was still getting things from the one that should have ended. I have vibrations and Toast messages that are triggered in the activity I was in they kept on coming even though it should have been over.

So what do I need to do? This app is a wearable app by the way just in case it works differently than on mobile phones

So in short I want to end the activity once and for all and clear it from the back stack.

Edit: regarding system services I do trigger vibrations at different times during my count down

        private void startTimer() {
        Log.println(Log.ASSERT, "CHECK","Entered startTimer() method");
        millisInFuture = mTimeLeftInMillis;
        mCountDownTimer = new CountDownTimer(mTimeLeftInMillis, 1000) {
            @Override
            public void onTick(long millisUntilFinished) {
                mTimeLeftInMillis = millisUntilFinished;
                updateCountDownText();
                millisPassed = millisInFuture - mTimeLeftInMillis;
                progress = (int) ((millisPassed * 100 / millisInFuture));
                pb.setProgress(progress);
//                pb2.setProgress(0);
//                pb3.setProgress(0);

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
                //Key: 60 sec
                if (millisInFuture == 480000) {
                    if (millisPassed <= 60000 || (millisPassed > 180000 && millisPassed <= 240000) || (millisPassed > 300000 && millisPassed <= 360000 || (millisPassed > 420000 && millisPassed <= 480000))) {
//                        Animation animation = AnimationUtils.loadAnimation(tool1mode1.this, R.anim.fade_in);
//                        stepupimage.setAnimation(animation);

                        Log.println(Log.ASSERT,"CHECK","Check that the first if statement of key 60 is entered");
                        statusIfUp();
                        time_of_stage = (millisInFuture - millisPassed) % 60000;
//                        progress2 = (int) (time_of_stage*100 / 60000);
                        Log.println(Log.VERBOSE,"CHECK","TIME OF STAGE = "+time_of_stage);
//                        Log.println(Log.VERBOSE,"CHECK","progress2= "+progress2);
//                        pb2.setProgress(progress2);
                        updateStageUpCount();
                        upArrowAnimation();

                        setflowrate();

                    } else if ((millisPassed > 60000 && millisPassed <= 180000)) {
//                        Animation animation = AnimationUtils.loadAnimation(tool1mode1.this, R.anim.fade_in);
//                        stepdownimage.setAnimation(animation);

                        Log.println(Log.ASSERT,"CHECK","Check that the second if statement of key 60 is entered");
                        statusIfDown();

                        time_of_stage = (millisInFuture - (millisPassed+60000)) % 120000;    //CREDIT GOES TO BASHMOHNDES AMIN
//                        progress3 = (int) (time_of_stage*100 / 120000);
                        Log.println(Log.VERBOSE,"CHECK","TIME OF STAGE = "+time_of_stage);
//                        Log.println(Log.VERBOSE,"CHECK","progress3= "+progress3);
//                        pb3.setProgress(progress3);
                        updateStageDownCount();
                        downArrowAnimation();

                        setFlowratetozero();

                    } else if ((millisPassed > 240000 && millisPassed <= 300000) || (millisPassed > 360000 && millisPassed <= 420000)){
//                        Animation animation = AnimationUtils.loadAnimation(tool1mode1.this, R.anim.fade_in);
//                        stepdownimage.setAnimation(animation);

                        Log.println(Log.ASSERT,"CHECK","Check that the first if statement of key 60 is entered");
                        statusIfDown();

                        time_of_stage = (millisInFuture - millisPassed) % 60000;
//                        progress3 = (int) (time_of_stage*100 / 60000);
                        Log.println(Log.VERBOSE,"CHECK","TIME OF STAGE = "+time_of_stage);
//                        Log.println(Log.VERBOSE,"CHECK","progress3= "+progress3);
//                        pb3.setProgress(progress3);
                        updateStageDownCount();
                        downArrowAnimation();

                        setFlowratetozero();
                    }

                }
                //key:90 sec ----> 01:30
                else if (millisInFuture == 720000) {
                    if ((millisPassed <= 90000) || (millisPassed > 270000 && millisPassed <= 360000)
                            || (millisPassed > 450000 && millisPassed <= 540000)
                            || (millisPassed > 630000 && millisPassed <= 720000)) {
//                        Animation animation = AnimationUtils.loadAnimation(tool1mode1.this, R.anim.fade_in);
//                        stepupimage.setAnimation(animation);
                        statusIfUp();
                        time_of_stage = (millisInFuture - millisPassed) % 90000;
//                        progress2 = (int) (time_of_stage*100 / 90000);
                        Log.println(Log.VERBOSE,"CHECK","TIME OF STAGE = "+time_of_stage);
//                        Log.println(Log.VERBOSE,"CHECK","progress2= "+progress2);
//                        pb2.setProgress(progress2);
                        updateStageUpCount();
                        upArrowAnimation();
                        setflowrate();
                    } else if ((millisPassed > 90000 && millisPassed <= 270000)) {
                        statusIfDown();
                        time_of_stage = ((millisInFuture+90000) - millisPassed) % 180000;
//                        progress3= (int) (time_of_stage*100 / 180000);
                        Log.println(Log.VERBOSE,"CHECK","TIME OF STAGE = "+time_of_stage);
                        Log.println(Log.VERBOSE,"CHECK","progress3= "+progress3);
//                        pb3.setProgress(progress3);
                        updateStageDownCount();
                        downArrowAnimation();
                        setFlowratetozero();

                    } else if ((millisPassed > 360000 && millisPassed <= 450000) || (millisPassed > 540000 && millisPassed <= 630000)) {
//                        Animation animation = AnimationUtils.loadAnimation(tool1mode1.this, R.anim.fade_in);
//                        stepdownimage.setAnimation(animation);
                        statusIfDown();
                        time_of_stage = (millisInFuture - millisPassed) % 90000;
//                        progress3= (int) (time_of_stage*100 / 90000);
                        Log.println(Log.VERBOSE,"CHECK","TIME OF STAGE = "+time_of_stage);
//                        Log.println(Log.VERBOSE,"CHECK","progress3= "+progress3);
//                        pb3.setProgress(progress3);
                        updateStageDownCount();
                        downArrowAnimation();
                        setFlowratetozero();
                    }
                }
                //key:120 sec ----> 02:00
                else if (millisInFuture == 960000) {
                    if (millisPassed <= 120000 || millisPassed > 360000 && millisPassed <= 480000 || millisPassed > 600000 && millisPassed <= 720000 || millisPassed > 840000 && millisPassed <= 960000) {
                        statusIfUp();
                        time_of_stage = (millisInFuture - millisPassed) % 120000;
//                        progress2 = (int) (time_of_stage*100 / 120000);
                        Log.println(Log.VERBOSE,"CHECK","TIME OF STAGE = "+time_of_stage);
//                        Log.println(Log.VERBOSE,"CHECK","progress2= "+progress2);
//                        pb2.setProgress(progress2);
                        updateStageUpCount();
                        upArrowAnimation();
                        setflowrate();

                    } else if (millisPassed > 120000 && millisPassed <= 360000) {
                        statusIfDown();
                        time_of_stage = ((millisInFuture+120000) - millisPassed) % 240000;
//                        progress3= (int) (time_of_stage*100 / 240000);
                        Log.println(Log.VERBOSE,"CHECK","TIME OF STAGE = "+time_of_stage);
                        Log.println(Log.VERBOSE,"CHECK","progress3= "+progress3);
//                        pb3.setProgress(progress3);
                        updateStageDownCount();
                        downArrowAnimation();
                        setFlowratetozero();
                    }  else if (millisPassed > 480000 && millisPassed <= 600000 || millisPassed > 720000 && millisPassed <= 840000) {
                        statusIfDown();
                        time_of_stage = (millisInFuture - millisPassed) % 120000;
//                        progress3= (int) (time_of_stage*100 / 120000);
                        Log.println(Log.VERBOSE,"CHECK","TIME OF STAGE = "+time_of_stage);
//                        Log.println(Log.VERBOSE,"CHECK","progress3= "+progress3);
//                        pb3.setProgress(progress3);
                        updateStageDownCount();
                        downArrowAnimation();
                        setFlowratetozero();
                    }
                }
                //key:20 sec ----> 00:20
                else if (millisInFuture == 160000) {
                    if (millisPassed <= 20000 || millisPassed > 60000 && millisPassed <= 80000 || millisPassed > 100000 && millisPassed <= 120000 || millisPassed > 140000 && millisPassed <= 160000) {
                        statusIfUp();
                        time_of_stage = (millisInFuture - millisPassed) % 20000;
//                        progress2 = (int) (time_of_stage*100 / 20000);
                        Log.println(Log.VERBOSE,"CHECK","TIME OF STAGE = "+time_of_stage);
//                        Log.println(Log.VERBOSE,"CHECK","progress2= "+progress2);
//                        pb2.setProgress(progress2);
                        updateStageUpCount();
                        upArrowAnimation();

                        setflowrate();
                    } else if (millisPassed > 20000 && millisPassed <= 60000) {
                        statusIfDown();
                        time_of_stage = ((millisInFuture+20000) - millisPassed) % 40000;
//                        progress3 = (int) (time_of_stage*100 / 40000);
                        Log.println(Log.VERBOSE,"CHECK","TIME OF STAGE = "+time_of_stage);
//                        Log.println(Log.VERBOSE,"CHECK","progress2= "+progress3);
//                        pb3.setProgress(progress3);
                        updateStageDownCount();
                        downArrowAnimation();

                        setFlowratetozero();
                    } else if (millisPassed > 80000 && millisPassed <= 100000 || millisPassed > 120000 && millisPassed <= 140000) {
                        statusIfDown();
                        time_of_stage = (millisInFuture - millisPassed) % 20000;
                        progress3 = (int) (time_of_stage*100 / 20000);
                        Log.println(Log.VERBOSE,"CHECK","TIME OF STAGE = "+time_of_stage);
//                        Log.println(Log.VERBOSE,"CHECK","progress3= "+progress3);
//                        pb3.setProgress(progress3);
                        updateStageDownCount();
                        downArrowAnimation();

                        setFlowratetozero();
                    }
                }
                //key:30 sec ----> 00:30
                else if (millisInFuture == 240000) {
                    if (millisPassed <= 30000 || millisPassed > 90000 && millisPassed <= 120000 || millisPassed > 150000 && millisPassed <= 180000 || millisPassed > 210000 && millisPassed <= 240000) {
                        statusIfUp();
                        time_of_stage = (millisInFuture - millisPassed) % 30000;
//                        progress2 = (int) (time_of_stage*100 / 30000);
                        Log.println(Log.VERBOSE,"CHECK","TIME OF STAGE = "+time_of_stage);
//                        Log.println(Log.VERBOSE,"CHECK","progress2= "+progress2);
//                        pb2.setProgress(progress2);
                        updateStageUpCount();
                        upArrowAnimation();
                        setflowrate();
                    } else if (millisPassed > 30000 && millisPassed <= 90000) {
                        statusIfDown();
                        time_of_stage = ((millisInFuture + 30000) - millisPassed) % 60000;
//                        progress3 = (int) (time_of_stage*100 / 60000);
                        Log.println(Log.VERBOSE,"CHECK","TIME OF STAGE = "+time_of_stage);
//                        Log.println(Log.VERBOSE,"CHECK","progress3= "+progress3);
//                        pb3.setProgress(progress3);
                        updateStageDownCount();
                        downArrowAnimation();
                        setFlowratetozero();
                    } else if (millisPassed > 120000 && millisPassed <= 150000 || millisPassed > 180000 && millisPassed <= 210000) {
                        statusIfDown();
                        time_of_stage = (millisInFuture - millisPassed) % 30000;
                        progress3 = (int) (time_of_stage*100 / 30000);
                        Log.println(Log.VERBOSE,"CHECK","TIME OF STAGE = "+time_of_stage);
//                        Log.println(Log.VERBOSE,"CHECK","progress3= "+progress3);
//                        pb3.setProgress(progress3);
                        updateStageDownCount();
                        downArrowAnimation();
                        setFlowratetozero();
                    }
                }
                //key:60 sec ----> 01:00
                else if (millisInFuture == 480000) {
                    if (millisPassed <= 60000 || (millisPassed > 180000 && millisPassed <= 240000) || (millisPassed > 300000 && millisPassed <= 360000 || (millisPassed > 420000 && millisPassed <= 480000))) {
                        statusIfUp();
                        time_of_stage = (millisInFuture - millisPassed) % 60000;
                        Log.println(Log.VERBOSE,"CHECK","TIME OF STAGE = "+time_of_stage);
                        upArrowAnimation();
                        setflowrate();

                    } else if ((millisPassed > 60000 && millisPassed <= 180000)) {
                        statusIfDown();
                        time_of_stage = (millisInFuture - (millisPassed+60000)) % 120000;    //CREDIT GOES TO BASHMOHNDES AMIN
                        Log.println(Log.VERBOSE,"CHECK","TIME OF STAGE = "+time_of_stage);
                        updateStageDownCount();
                        downArrowAnimation();
                        setFlowratetozero();

                    } else if ((millisPassed > 240000 && millisPassed <= 300000) || (millisPassed > 360000 && millisPassed <= 420000)){
                        statusIfDown();
                        time_of_stage = (millisInFuture - millisPassed) % 60000;    //CREDIT GOES TO BASHMOHNDES AMIN
                        Log.println(Log.VERBOSE,"CHECK","TIME OF STAGE = "+time_of_stage);
                        updateStageDownCount();
                        downArrowAnimation();
                        setflowrate();

                    }

                }

            }

            @Override
            public void onFinish() {
                Toast.makeText(tool1mode1.this, "Done", Toast.LENGTH_SHORT).show();
                avd2.stop(); avd3.stop();
                try {
                    pb.setProgress(100);
//                    pb2.setProgress(0); pb3.setProgress(0);
                    stage_timer.setVisibility(View.INVISIBLE);
                    rotateLoading.setTranslationY(60);
                    rotateLoading.stop();
//                    progressBar.setVisibility(View.INVISIBLE);
//                    progressBar2.setVisibility(View.INVISIBLE);
//                    progressBar.setProgress(0);
//                    progressBar2.setProgress(0);
//                    progressBar.setTranslationY(60);
//                    progressBar2.setTranslationY(60);
                    flow.setTranslationY(60);


                    animation1.cancel(); animation2.cancel();

                    Intent stoppump = new Intent(tool1mode1.this, stop_pump.class);
                    startActivity(stoppump);
                    //Vibration
                    if (Build.VERSION.SDK_INT >= 26) {
                        ((Vibrator) getSystemService(VIBRATOR_SERVICE)).vibrate(VibrationEffect.createOneShot(150, VibrationEffect.DEFAULT_AMPLITUDE));
                    } else {
                        ((Vibrator) getSystemService(VIBRATOR_SERVICE)).vibrate(VibrationEffect.createWaveform(new long[]{150}, new int[]{VibrationEffect.EFFECT_CLICK}, -1));
                    }
                }
                catch (NullPointerException e) {
                    e.printStackTrace();
                }

            }
        }.start();

This is when the countdowntimer finishes and the other is during different stages within the total time:

  private void stageSwitchVibration()
{
        Toast.makeText(tool1mode1.this, "stage switch", Toast.LENGTH_SHORT).show();
        //Vibration
        if (Build.VERSION.SDK_INT >= 26) {
            ((Vibrator) getSystemService(VIBRATOR_SERVICE)).vibrate(VibrationEffect.createOneShot(300, VibrationEffect.DEFAULT_AMPLITUDE));
        } else {
            ((Vibrator) getSystemService(VIBRATOR_SERVICE)).vibrate(VibrationEffect.createWaveform(new long[]{150}, new int[]{VibrationEffect.EFFECT_CLICK}, -1));
        }

}
2

There are 2 best solutions below

3
JensV On

Registered listeners and such are not tied to the activity. If you have active listeners, they will keep the reference to the activity whether it's finished or not. If you don't close out all listeners, you essentially create a memory leak.

(The exception to this are Lifecycle Aware components, for example ViewModel, LiveData)

This is also generally avoided by correctly implementing some pattern like MVVM, MVC, etc. and understanding what components need to be initialized/deinitialized.


The main takeaway from this is that any code in an Activity/Fragment/Service/etc. does not suddenly not run anymore when it is finished or stopped.

Keep track of listeners / callbacks or similar and check if they are lifecycle aware. If not, you need to unregister them yourself.

3
benjiii On

Is your mCountDownTimer linked to your activity? if so, you may need to call mCountDownTimer.cancel(); in the onDestroy() method, ie:

@Override
protected void onDestroy() {
    super.onDestroy();
    mCountDownTimer.cancel();
}