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));
}
}
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.