19

I created an android application with a logout option in onCreateOptionsMenu. The Logout works perfectly but when I press the back button again it takes me to the previous activity, and when it gets a null value it redirects to login screen. Now my login screen appears again and again. I want to close the app completely when I press the back button but don't know how.

Here is my code to handle the back button press in the login screen:

@Override
public void onBackPressed() {
    new AlertDialog.Builder(this)
        .setTitle("BidNEMO")
        .setMessage("Are you sure you want to exit?")
        .setNegativeButton(android.R.string.no, null)
        .setPositiveButton(android.R.string.yes, new OnClickListener() {
         public void onClick(DialogInterface arg0, int arg1) {
         Main.super.onBackPressed();
         finish();
         }
         }).create().show();
     }

please help guyss..

Jeshurun
  • 22,940
  • 6
  • 79
  • 92
Brett
  • 431
  • 2
  • 10
  • 26

8 Answers8

61

To Quit Application on Button click use this code :

Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_HOME);
startActivity(intent);

Try it..

To kill the complete app and remove it from Runningapp list kill the app through its pid(its nasty)... use this lines before above code.

int pid = android.os.Process.myPid();
android.os.Process.killProcess(pid);
David
  • 15,894
  • 22
  • 55
  • 66
Amresh
  • 2,098
  • 16
  • 20
  • 4
    you are just calling home via intent. How is it different from calling another activity's intent. i dont think the app will close. instead it will minimize. – SMR Feb 20 '14 at 12:51
  • whats your requirement ?? – Amresh Feb 20 '14 at 13:13
  • I just want to make sure that the above code *Actually Quits* the app or just brings home screen on front. just to be clear :) – SMR Feb 20 '14 at 13:20
  • It Quits the app... Do check it – Amresh Feb 20 '14 at 13:22
  • **Only** if you also include `super.onBackPressed()` and no other activity is in the `backstack` other wise it does't. – SMR Feb 20 '14 at 13:27
  • It was a general answer.... i have just posted the required code which can be used anywhere.. and i have clearly mentioned `on Button` click. – Amresh Feb 20 '14 at 13:31
  • 1
    let us [continue this discussion in chat](http://chat.stackoverflow.com/rooms/47956/discussion-between-smr-and-ryderz) – SMR Feb 20 '14 at 13:34
  • KillProcess should be killProcess, the first letter K be small k, fixed. – David May 21 '14 at 04:56
  • Thank you guys! Saved my neck, also the chat was helpful! – rgv Dec 21 '15 at 22:16
24

If you want to close application completely you should use finishAffinity(); instead of finish() . It will clear all stack of activities previously opened by an application.

Anonymous
  • 1,726
  • 4
  • 22
  • 47
12

For API 21 and up

finishAndRemoveTask()

You can call this to close the app completely. All activities will finish() and the app is removed from the task list.

Mick Ashton
  • 356
  • 4
  • 15
5

To Finish an Activity I'm using this code:

public void appExit () {
    this.finish();
    Intent intent = new Intent(Intent.ACTION_MAIN);
    intent.addCategory(Intent.CATEGORY_HOME);
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    startActivity(intent);
}  //close method

or kill Process with this code:

int pid = android.os.Process.myPid();
android.os.Process.killProcess(pid);
MUMBUÇOĞLU
  • 251
  • 1
  • 8
  • 24
chiru
  • 635
  • 1
  • 7
  • 14
3

For Xamarin Users:

int pid = Android.OS.Process.MyPid();
Android.OS.Process.KillProcess(pid);

put it in your OnDestroy() function.

Edit:

After investigating it thoroughly, I found out that even the above code I wrote does not "Kill" the app totally (deleting it from task manager - "recent apps"). Eventually, after a lot of code tryouts, I managed to figure something out, Overriding "Finish" functions with this code:

public override void Finish()
    {
        if (Android.OS.Build.VERSION.SdkInt >= BuildVersionCodes.Lollipop)
        {
            base.FinishAndRemoveTask();
        }
        else
        {
            base.Finish();
        }
    }

this is the sole solution for that question!

Roy Doron
  • 585
  • 9
  • 23
0

Even if it looks ok killing process will cause you headache in future. You can ensure this by following use case:

  1. call several activities to populate activities stack
  2. call android.os.Process.killProcess(pid);
  3. open your application

OBSERVED: Your application opens not from main activity in inconsistent way. This is because Android consider killing of process like crash.

You can find more detailed information here: Is quitting an application frowned upon?

Community
  • 1
  • 1
Pavel Polushkin
  • 358
  • 2
  • 8
0
android.os.Process.killProcess(android.os.Process.myUid());

I think this is better. How about it ?

0

SOLUTION 2023

Closing the application with process removal, it gives the result of a smooth closing and removal of all application processes after 100 milliseconds:

enter image description here


override fun exit() {
    coroutine.launch(Dispatchers.Main) {
        finishAndRemoveTask()
        delay(100)
        exitProcess(0)
    }
}
starball
  • 20,030
  • 7
  • 43
  • 238