Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Close Android Application [duplicate]

Tags:

android

Please suggest how I may close my whole Android Application with one line code.

like image 796
Amit Avatar asked Jul 19 '10 08:07

Amit


People also ask

How do you close a whole app on Android?

To close apps on Android, swipe up from the bottom of the screen and hold until the recent apps menu pops up (if you use gesture navigations). If you use button navigation, tap on the recent apps button. Swipe up to close individual apps or tap the Close all button to close all background apps.

How do you exit an application?

You can call System. exit(); to get out of all the acivities.

How do I stop apps from running in my Android library?

If you want app to be stopped immediately then you have to press the Red stop button. Play button will stop the app only after gradle build is finished.

How do I force stop a program in Android programmatically?

You can try finishAndRemoveTasks(); instead of finish(); in your snippet. This would kill your application's all activities and all process and even remove for recent apps from task manager.


1 Answers

Yes - Why, then how(sort of):

Short answer:

System.exit(0); 

This nicely and cleanly terminates the whole java machine which is dedicated to running the app. However, you should do it from the main activity, otherwise android may restart your app automatically. (Tested this on Android 7.0)

Details and explanation of why this is a good question and a programmer may have a very legitimate reason to terminate their app this way:

I really don't see the gain in speaking harshly to someone who's looking for a way to terminate their app.

Good is a friendly reminder to beginners that on Android you don't have to worry about closing your app -- but some people actually do want to terminate their app even though they know that they don't have to -- and their question of how to do so is a legitimate question with a valid answer.

Perhaps many folks live in an ideal world and don't realize that there's a real world where real people are trying to solve real problems.

The fact is that even with android, it is still a computer and that computer is still running code, and that it is perfectly understandable why someone may wish to truly exit their "app" (i.e. all of the activities and resources belonging to their app.)

It is true that the developers at Google designed a system where they believed nobody would ever need to exit their app. And maybe 99% of the time they are right!

But one of the amazing things about allowing millions of programmers to write code for a platform is that some of them will try to push the platform to its limits in order to do amazing things! -- Including things that the Android Developers never even dreamed of!

There is another need for being able to close a program, and that is for troubleshooting purposes. That is what brought me to this thread: I'm just learning how to utilize the audio input feature to do realtime DSP.

Now don't forget that I said the following: I well know that when I have everything done right, I won't need to kill my app to reset the audio interface.

BUT: Remember, perfect apps don't start out as perfect apps! They start out as just barely working apps and grow to become proper ideal apps.

So what I found was that my little audio oscilloscope test app worked great until I pressed the android Home button. When I then re-launched my oscilloscope app, there was no audio coming in anymore.

At first I would go into Settings->Applications->Manage Applications->AppName->Force Stop.

(Note that if the actual linux process is not running, the Force Stop button will be disabled. If the button is enabled, then the Linux process is still running!)

Then I could re-launch my app and it worked again.

At first, I was just using divide by zero to crash it - and that worked great. But I decided to look for a better way - which landed me here!

So here's the ways I tried and what I found out:

Background: Android runs on Linux. Linux has processes and process IDs (PIDs) just like Windows does, only better. To see what processes are running on your android (with it connected into the USB and everything) run adb shell top and you will get an updating list of all the processes running in the linux under the android.

If you have linux on your PC as well, you can type

adb shell top | egrep -i '(User|PID|MyFirstApp)' --line-buffered

to get just the results for your app named MyFirstApp. You can see how many Linux Processes are running under that name and how much of the cpu power they are consuming.

(Like the task manager / process list in Windows)

Or if you want to see just the running apps:

adb shell top | egrep -i '(User|PID|app_)' --line-buffered

You can also kill any app on your device by running adb shell kill 12345 where 12345 is it's PID number.

From what I can tell, each single-threaded app just uses a single Linux process.

So what I found out was that (of course) if I just activate the android Home option, my app continues to run. And if I use the Activity.finish(), it still leaves the process running. Divide by zero definitely terminates the linux process that is running. Killing the PID from within the app seems the nicest so far that I've found, at least for debugging purposes.

I initially solved my need to kill my app by adding a button that would cause a divide by zero, like this in my MainActivity.java:

public void exit(View view) {     int x;     x=1/0; } 

Then in my layout XML file section for that button I just set the android:onClick="exit".

Of course divide by zero is messy because it always displays the "This application stopped..." or whatever.

So then I tried the finish, like this:

public void exit(View view) {     finish(); } 

And that made the app disappear from the screen but it was still running in the background.

Then I tried:

public void exit(View view) {       android.os.Process.killProcess(android.os.Process.myPid()); } 

So far, this is the best solution I've tried.

UPDATE: This is the same as above in that it instantly terminates the Linux process and all threads for the app:

public void exit(View view) {       System.exit(0); } 

It instantly does a nice full exit of the thread in question without telling the user that the app crashed.

All memory used by the app will be freed. (Note: Actually, you can set parameters in your manifest file to cause different threads to run in different Linux processes, so it gets more complicated then.)

At least for quick and dirty testing, if you absolutely need to know that the thread is actually fully exited, the kill process does it nicely. However, if you are running multiple threads you may have to kill each of those, probably from within each thread.

EDIT: Here is a great link to read on the topic: http://developer.android.com/guide/components/fundamentals.html It explains how each app runs in its own virtual machine, and each virtual machine runs under its own user ID.

Here's another great link that explains how (unless specified otherwise in manifest) an app and all of its threads runs in a single Linux process: http://developer.android.com/guide/components/processes-and-threads.html

So as a general rule, an app really is a program running on the computer and the app really can be fully killed, removing all resources from memory instantly.

(By instantly I mean ASAP -- not later whenever the ram is needed.)

PS: Ever wonder why you go to answer your android phone or launch your favorite app and it freezes for a second? Ever reboot because you get tired of it? That's probably because of all the apps you ran in the last week and thought you quit but are still hanging around using memory. Phone kills them when it needs more memory, causing a delay before whatever action you wanted to do!

Update for Android 4/Gingerbread: Same thing as above applies, except even when an app exits or crashes and its whole java virtual machine process dies, it still shows up as running in the app manager, and you still have the "force close" option or whatever it is. 4.0 must have an independent list of apps it thinks is running rather than actually checking to see if an app is really even running.

like image 123
Jesse Gordon Avatar answered Sep 21 '22 18:09

Jesse Gordon