How to close an android application?
Asked Answered
M

6

15

There are many question regarding this topic but there is no clear answer. Although android's memory management is very solid, so many people believe that we shouldn't kill android application. My case is different. I want an option to close an application. I found following code for closing application but sometimes it doesn't work.It seems application just refreshing itself when i hit exit button on my application.

MainActivity.java

@Override
    public void onDestroy()
    {
        super.onDestroy();
        /*
         * Notify the system to finalize and collect all objects of the
         * application on exit so that the process running the application can
         * be killed by the system without causing issues. NOTE: If this is set
         * to true then the process will not be killed until all of its threads
         * have closed.
         */
        System.runFinalizersOnExit(true);

        /*
        * Force the system to close the application down completely instead of
        * retaining it in the background. The process that runs the application
        * will be killed. The application will be completely created as a new
        * application in a new process if the user starts the application
        * again.
        */
        System.exit(0);
    }

@Override
public boolean onMenuItemSelected(int featureId, MenuItem item) {
switch(item.getItemId()) {
   case R.id.close:
                Intent intentFinish = new Intent(this, FinishActivity.class).setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                startActivity(intentFinish);
                finish();
                return true;
}
return super.onMenuItemSelected(featureId, item);
}

FinishActivity.java

package com.mypackage;

import android.app.Activity;
import android.os.Bundle;

public class FinishActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        finish();
    }
}

I also tried Process.killProcess(Process.myPid()); but it doesn't work.

Metathesize answered 2/4, 2012 at 10:32 Comment(2)
Unless you have a really, really, really valid argumentation, you should never close the app programmatically.Zilpah
Possible duplicate of How to force stop my android application programmatically?Heliogabalus
M
34

I found my solution. Use this to close an application

Intent homeIntent = new Intent(Intent.ACTION_MAIN);
homeIntent.addCategory( Intent.CATEGORY_HOME );
homeIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(homeIntent);
Metathesize answered 7/4, 2012 at 4:37 Comment(4)
after tried many solutions i found this is perfect ..Thank youScotney
@RaviPatel: Does this 'kill' an application or does it just launch the default launcher on the device?Characterize
@Basher51: It closes the application and launch the default launcher.Metathesize
it does not kill the app, the Application Object still remains and thus the app is still considered aliveSightly
R
10
public void endTask() {
    // Is the user running Lollipop or above?
    if (Build.VERSION.SDK_INT >= 21) { 
        // If yes, run the fancy new function to end the app and
        //  remove it from the task list.
        finishAndRemoveTask();
    } else {
        // If not, then just end the app without removing it from
        //  the task list.
        finish();
    }
}
Refund answered 11/2, 2015 at 18:14 Comment(9)
Code-only answers aren't much useful.Unexpressed
I have comments in my code which should explain it. If something doesn't make sense please let me know :)Refund
WTH are you talking about @dergolem? Code-only answers are EXTREMELY useful!Tinney
@Tinney Are you joking, I hope? Code-only answers don't explain anything. The OP won't learn WHAT the error was and HOW it was fixed. And you call this EXTREMELY useful?Unexpressed
@dergolem what are you talking about? The code ain't arcane magic ruins. You can read this code and see how it works. Edit: further I'd add code is a lot less ambiguous langauge than english to explain things anyway.Flews
@Tinney Let's finish it here.Unexpressed
would this cause a RuntimeException if you ran this code on a device with say SDK Level 16? or would that line of code with the "finishAndRemoveTask" never be looked at by the runtime?Footing
FYI, links to relevant documentation: finish() and finishAndRemoveTask()Hautevienne
Solution doesn't seem to close the application completely. When I "reopened" the app, it still had some state from before it appeared to close.Hautevienne
A
4

you have used System.exit(0); , I would like suggest you not to use it. It is not a good programming style to use it. There is a method called finish(); in Activity to finish any Activity's Execution. You should use it.

Process.killProcess(Process.myPID()); is also not preferable to use.

Ault answered 2/4, 2012 at 10:36 Comment(4)
You are right but calling finish() on activity does not completely close the application. Application is still visible in task manager applications. I don't want that to happen.Metathesize
Yes, Agree with you. but AFIAIK, Android doesn't 100% guarantee to close the Activity.Ault
@Lucifer: other then system.exit and kill process,is there any other technique to gracefully kill the application completely and not just an activity? I am using my app for a kiosk,which would not have a dedicated user to take care of the apps.As a backup I need a functionality to start the app afresh(during very rare cases) on its own.How can I go about this?Characterize
@Characterize did you manage to find a solution for this? I am also doing kiosk app.Lamere
S
1

If you want to exit from an activity use finish() method of the activity, as Lucifer has suggested. It will simply finish the current activity. But if you want to exit from application(destroy all the activities upto Home Screen) use following Block of Code:

Intent intent=new Intent(this, HomeClass.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
Skiing answered 2/4, 2012 at 10:42 Comment(2)
what is HomeClass represents?Metathesize
HomeClass, represents Home Screen, which can be displayed by pressing HomeKey, and when device starts its first Screen.Skiing
M
1
switch(item.getItemId()) {
case R.id.close:
            Intent intentFinish = new Intent(this,FinishActivity.class).setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            startActivity(intentFinish);
            finish();
            return true;
}

why are you calling an activity which finishes itself (FinishActivity), then call finish() on the current activity (MainActivity) - whatever, the finish in the main activity is pointless.

Magnanimity answered 2/4, 2012 at 10:42 Comment(0)
C
0
@Override
    public boolean onKeyUp(int keyCode, KeyEvent event) {
        // TODO Auto-generated method stub
        if(keyCode == KeyEvent.KEYCODE_BACK)
        {
            finish();
            return true;
        }
        else{
            return super.onKeyUp(keyCode, event);
        }
    }

use the above method in the very first activity that is launched on app start up

Comfort answered 2/4, 2012 at 10:49 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.