Is quitting an application frowned upon?
Asked Answered
R

40

1251

Moving on in my attempt to learn Android, I just read the following:

Question: Does the user have a choice to kill the application unless we put a menu option in to kill it? If no such option exists, how does the user terminate the application?

Answer: (Romain Guy): The user doesn't, the system handles this automatically. That's what the activity lifecycle (especially onPause/onStop/onDestroy) is for. No matter what you do, do not put a "quit" or "exit" application button. It is useless with Android's application model. This is also contrary to how core applications work.

Hehe, for every step I take in the Android world I run into some sort of problem =(

Apparently, you cannot quit an application in Android (but the Android system can very well totally destroy your app whenever it feels like it). What's up with that? I am starting to think that it's impossible to write an app that functions as a "normal app" - that the user can quit the app when he/she decides to do so. That is not something that should be relied upon the OS to do.

The application I am trying to create is not an application for the Android Market. It is not an application for "wide use" by the general public, it is a business app that is going to be used in a very narrow business field.

I was actually really looking forward to developing for the Android platform, since it addresses a lot of issues that exist in Windows Mobile and .NET. However, the last week has been somewhat of a turnoff for me... I hope I don't have to abandon Android, but it doesn't look very good right now =(

Is there a way for me to really quit the application?

Reformer answered 9/1, 2010 at 15:59 Comment(2)
Well, you can put this together with another quirk of android and partake of fun and profit. When I first did a network call on Android my app crash-quit instantly because "main thread" hehe. So, the way for you to really quit the application is just do a network call on the main thread haha .. or many of the other things that Android frowns upon lolChivalrous
Stop to think about "normal app" as like desktop app. Android isn't a desktop platform, there is no such this. A "normal" mobile app let the system control the lifecycle, not the dev. The system expect that, the users expect that. All you need to do is change your mindset and learn how to build on it. Don't try to clone a desktop app on mobile. Everything is completely different including UI/UX.Liturgist
C
1341

This will eventually get to your question, but I first want to address a number of issues you raise in your various comments to the various answers already given at the time of this writing. I have no intention of changing your mind -- rather, these are here for others who come to read this post in the future.

The point is that I cannot allow for Android to determine when my app is going to be terminated. that must be the choice of the user.

Millions of people are perfectly happy with the model where the environment closes up the application as needed. Those users simply don't think about "terminating" the Android app, any more than they think about "terminating" a Web page or "terminating" a thermostat.

iPhone users are much the same way, in that pressing the iPhone button does not necessarily "feel" like the app was terminated since many iPhone apps pick up where the user left off, even if the app really was shut down (since iPhone only allows one third-party app at a time, at present).

As I said above, there is a lot of things going on in my app (data being PUSHed to the device, lists with tasks that always should be there, etc.).

I don't know what "lists with tasks that always should be there" means, but the "data being PUSHed to the device" is a pleasant fiction and should not be done by activity in any case. Use a scheduled task (via AlarmManager) to update your data for maximum reliability.

Our users log in and can't be doing that every time they get a phone call and Android decides to kill the app.

There are many iPhone and Android applications that deal with this. Usually, it is because they hold onto login credentials, rather than forcing users to log in every time manually.

For example, we want to check updates when exiting the application

That is a mistake on any operating system. For all you know, the reason your application is being "exited" is because the OS is shutting down, and then your update process will fail mid-stream. Generally, that's not a good thing. Either check updates on start or check updates totally asynchronously (e.g., via a scheduled task), never on exit.

Some comments suggest that hitting the back button does not kill the app at all (see link in my question above).

Pressing the BACK button does not "kill the app". It finishes the activity that was on-screen when the user pressed the BACK button.

It should only terminate when the users want to terminate it - never ever any other way. If you can't write apps that behave like that in Android, then I think that Android can't be used for writing real apps =(

Then neither can Web applications. Or WebOS, if I understand their model correctly (haven't had a chance to play with one yet). In all of those, users don't "terminate" anything -- they just leave. iPhone is a bit different, in that it only presently allows one thing to run at a time (with a few exceptions), and so the act of leaving implies a fairly immediate termination of the app.

Is there a way for me to really quit the application?

As everybody else told you, users (via BACK) or your code (via finish()) can close up your currently-running activity. Users generally don't need anything else, for properly-written applications, any more than they need a "quit" option for using Web applications.


No two application environments are the same, by definition. This means that you can see trends in environments as new ones arise and others get buried.

For example, there is a growing movement to try to eliminate the notion of the "file". Most Web applications don't force users to think of files. iPhone apps typically don't force users to think of files. Android apps generally don't force users to think of files. And so on.

Similarly, there is a growing movement to try to eliminate the notion of "terminating" an app. Most Web applications don't force the user to log out, but rather implicitly log the user out after a period of inactivity. Same thing with Android, and to a lesser extent, iPhone (and possibly WebOS).

This requires more emphasis on application design, focusing on business goals, and not sticking with an implementation model tied to a previous application environment. Developers who lack the time or inclination to do this will get frustrated with newer environments that break their existing mental model. This is not the fault of either environment, any more than it is the fault of a mountain for storms flowing around it rather than through it.

For example, some development environments, like Hypercard and Smalltalk, had the application and the development tools co-mingled in one setup. This concept did not catch on much, outside of language extensions to apps (e.g., VBA in Excel, Lisp in AutoCAD). Developers who came up with mental models that presumed the existence of development tools in the app itself, therefore, either had to change their model or limit themselves to environments where their model would hold true.

So, when you write:

Along with other messy things I discovered, I think that developing our app for Android is not going to happen.

That would appear to be for the best, for you, for right now. Similarly, I would counsel you against attempting to port your application to the Web, since some of the same problems you have reported with Android you will find in Web applications as well (e.g., no "termination"). Or, conversely, someday if you do port your app to the Web, you may find that the Web application's flow may be a better match for Android, and you can revisit an Android port at that time.

Collen answered 9/1, 2010 at 15:59 Comment(37)
Thanks for this answer commonsware =) And I agree totally. Actually, I made the reference and comparison between Android and a webpage yesterday when I discussed these issues with my collegue with whom I work. I indeed feel that Android tries to imitate some form of webpage, and that is not what I call "a real app" (even though that is subjective of course). If the app could be transformed to a WebApp, then I might just create a webpage and ask the users to start their web browser. But thats not the case =(Reformer
Im not going to comment in detail on all what you wrote. They are all good and valid comments, but not really knowing what our apps is and how it is working today (the server structure cannot change, the idea was to port the mobile app to Android) makes it hard, of course, for you to see whats needed. Even though we "keep login credentials", that would mean that the users logs in everytime something happens on the device and the server is isnstructed to react in certain ways on login. That cant be done just randomly, as would happen in an Android-application...Reformer
Mark: Thanks for the good summary. Ted: We're very slowly discovering what functionality you require, like long-lived sessions. As mentioned, you can use a Service for that. Also, I doubt that you need to log in to your app each time you interact with the server -- surely there's a session ID token you can hold onto?Geophyte
One thought that drifted in my head: If I just rewrite the whole app as a Service, and treat that Service as the actual application - perhaps that would work better? Then I could "dumb up" the Activities (just as Android wants them) to just present data contained in the Service. In that case, I could perhaps keep login state and other stuff there. Using startForeground(int, Notification) I can almost stop Android from killing the Service...?Reformer
Well, actually the server just keeps track of "valid TCP-connections". When the client connects to server, the server only accepts the Login-packet. If such a packet is received, then the server checks to see if login == OK. If so, the TCP-connection used to send teh Login-packet is saved in a Hash. Whenever a incoming packet is received on one of the many TCP-connections in the server, the server know what User is logged in on that TCP-connection. So if the TCP-connection dies (android killed the app), a new login is required...Reformer
"Using startForeground(int, Notification) I can almost stop Android from killing the Service...?" Assuming your users will not mind having an icon in their status bar, this should work. Or, to put it another way, if your service still gets killed due to low RAM even after using startForeground(), you have much bigger problems.Collen
"How do you mean I have bigger problems?" I mean that the only way this will occur is if the device is having serious memory issues, probably requiring a reboot. A startForeground() service is 2nd-to-last to have to get killed off for memory reclamation (last being the foreground activity). Since Android apps do not have unlimited heap sizes, the only way this should occur is either because lots of apps are abusing startForeground() or if the OS itself is leaking RAM.Collen
"Please note that my users are professionals, that use the device for the sole purpose of using the application Im trying to port to Android." Actually, you have indicated otherwise ("cant be doing that everytime they get a phonecall" -- a "phonecall" is not your app). Moreover, unless you are building your own device, you can't prevent people from installing other apps if they so choose.Collen
As another aside, surely you'd be caching the user's credentials anyway if you're relying on long-lived TCP connections for session management? For a mobile application, it would seem a bit crazy to expect the user to manually re-establish their session just because the device lost the network temporarily.Geophyte
While your answer is correct for Java apps, there's a good reason to kill an application completely: If you're using NDK code of an app ported, for example, from iPhone, that isn't going to expect the process to be recycled, and therefore has a pile of code with global or static values that will be in an invalid state if the application "exits" and restarts. finish() doesn't even help here, in fact; the application won't even get an onDestroy() call until well after another instance has a chance to run, reusing the process. android.os.Process.killProcess(android.os.Process.myPid()); works. :)Edlun
@SomeCallMeTim: No, that is not a valid reason to use killProcess(). It is a valid reason to write better iOS code.Collen
@CommonsWare: Sorry, but that's a trite answer that is of no use to me. I'm porting code that I'm paid to port. Should I spent twice the time doing the port, rewriting their code, or get it done in the way that reduces costs for my employer, allowing them to put more games on Android sooner? It's an entirely academic question anyway: They don't want me to make such major changes to their engine, since I can't test the changes on iOS. AND it's simply wrong: There's nothing "bad" about using Singleton patterns for appropriate objects. Android is just broken WRT NDK apps.Edlun
@SomeCallMeTim: "application won't even get an onDestroy() call until well after another instance has a chance to run, reusing the process" -- color me skeptical, but even then, there should be ways to address the problem without resorting to killProcess() (e.g., detect the change in Application object in your NDK library). I suggest that you open a fresh SO question so we can get more info about the exact pattern you are using and problems you are perceiving.Collen
@SomeCallMeTim: Dianne Hackborn has officially endorsed your approach, should you need it: groups.google.com/group/android-developers/browse_thread/thread/… -- personally, I still think we could find an alternative.Collen
@CommonsWare: Thanks for letting me know about that thread. I'm in that group as well as the NDK group, but I only get emails for the NDK group, so I never saw that discussion.Edlun
tl;dr. but just wanted to add that YES, take your head out of the sand and agree that android documentation is a mess. i understand OP when he says he may never delevelop for android because of that (and maybe java:). e.g. they talk about the multi task android way, but then the menu example blatantly shows a "Quit" option.... wtf?!Cleavland
Im back on trying Android, and I ran into this quitting-business once again. One major problem with not being able to fully destroy/quit a Service/whatever is that it is insanely error-prone! If I could restart an app (for real) I would know for SURE that all variables are reset - that everything is initialized to its starting point. Now, I need to do all that manually. So if I add a variable, and then forget to reset also that I'm gonna have problems when I "relaunch" the app, as soem variables (and stuff) will be lingering. This is still something I cannot understand how anyone can defend.Reformer
Lifecycle management of activities by the OS is not an immutable law (if it were we would all be writing for iPhone instead). Many users prefer the warm fuzzy feeling of knowing an app is closed after they logout, not to mention avoiding the extra keypress to return to the home screen. Leaving an app hanging around when it is doing absolutely nothing is also a drain or resources while waiting for the OS to do it. If it weren't app killers wouldn't be so popular (and necessary).Adequate
@Reformer for more reliable reinitialization, maybe you could minimize the amount of state that is stored at the Activity or Service itself. Instead, place most of the state and code in a separate class that you recreate "from scratch" every time the Activity or Service starts.Lonnylonslesaunier
@BarryFruitman App killers are not necessary, and in fact will break many properly-functioning apps. An activity that isn't in the foreground isn't using the CPU, so there's no issue with "leaving it hanging around" i.e., cached in memory. The OS will just kill it if it needs the memory. And if an app is using the CPU but not running in the foreground, it is running a service; i.e., not "doing absolutely nothing".Winfredwinfrey
@Jon O: Yes, but CPU is not the only limited resource. Unused apps are a waste of RAM, too. The OS may kill them automatically, but it doesn't always do it in the order one might expect or prefer. As for app killers, I tend to agree with you now, but I still think a good old-fashioned "close" button is a good idea for certain apps.Adequate
@BarryFruitman On pretty much every platform, even after an app is closed, it stays cached in RAM until the system has a reason to replace it in RAM with something else. Android is no different (except in Android's case, the heap an app is allowed to use is bounded). The only time where that distinction between "closed" and "idle" becomes meaningful on Android is under very high memory load, and with phones approaching 2GiB of RAM, one isn't likely to run into them very often. (And 100% of RAM is always powered, so no impact on battery life by closing memory-resident idle apps.)Winfredwinfrey
@Jon O: 1) I'm pretty sure it is standard practice to free all RAM immediately when an app exits, especially in Android where every app gets its own JVM. Just because RAM isn't wiped doesn't mean anything is "cached". 2) I'm even more certain Android heap size is not unbounded. 3) Heavy memory load happens quite frequently on older devices. Not everyone has a 2Gb phone. 4) Unreleased RAM is not a waste of battery, but it is just a waste of... well, RAM.Adequate
@BarryFruitman 1) "Free" is commonly implemented as "indicate that someone else can use this should they need it". So if you reopen an app immediately, almost everything becomes a cache hit. 2) Agreed; reread! :) 3) Not certain but IIRC apps are closed in LRU order when contention occurs. 4) There is no such thing. It's only wasted if it isn't in use; unused RAM = free cache! geekfor.me/faq/you-shouldnt-be-using-a-task-killer-with-android <-- see the Addendum, especially.Winfredwinfrey
Regarding "Millions of people are perfectly happy with the model where the environment closes up the application as needed." Millions of people also have to wait several seconds to answer their phone after it rings because Android has to free memory first by killing apps you haven't used in weeks. I say if users want to exit the JVM that runs their app so that memory is available right away when they need it, then by all means let them! ~JesseColp
"Millions of people also have to wait several seconds to answer their phone after it rings because Android has to free memory first by killing apps you haven't used in weeks." -> Fortunately this is not the case. Android apps are generally killed a lot faster than that. Don't believe "fake" task managers and the fact that Android does, in fact, show you the app in the task manager, that doesn't mean it's using memory, in fact, you will rather have to fight to HAVE your memory not killed all the time at any time, than having to worry about the opposite.Pester
@CommonsWare, He is asking how to build an application like a web server. The "web app model" you so adore is actually severely limited. You can't build a database server or a web server using "web app model". Indeed, there is no such thing as a major application using pure "web app model" because a web app model itself relies on a web server that runs on "program model".Nucleotide
@MartínMarconcini, It doesn't change the fact that you'd have to wait. One second is one second too long. Anything near two seconds is an eternity.Nucleotide
@Nucleotide I agree that exit buttons are OK for some things (heck, even I had to add one to 8tracks app when I worked there, and it was a pain to add). But that is not going to make your Ringer faster.Pester
@MartínMarconcini, It has the potential to go faster when the OS does not need to kill tasks to get their memory before a new app can be launched.Nucleotide
@Nucleotide the benefits are superior to the few milliseconds you may gain. CPU on the other hand, may hinder your phone. Memory? most modern devices have enough ram to plan ahead and Android does a great job (I've always used Nexus devices). The same goes for iOS, the memory models work fine. Can it be improved? Sure but I'd say there are more important things than that. For example, the horrible state of the lifecycle between Activities and Fragments to name one.Pester
@MartínMarconcini, What superior benefits are you talking about? Implementing an exit button has the superior usability benefit. And there will never be enough ram, especially so on a hand-held device. Do you not know that demand grows with supply?Nucleotide
The superior benefits are many: Developers don't have to think about it 99% of the time. Users don't have to worry. Applications are consistent. It's not an issue with modern devices. You can certainly wait 50ms to answer your phone. Given the quality of code that I see from Android Developers (especially here on StackOverflow), I'm glad about this. Now… would I like an exit button that kills the process (And its children) at Operating System Level? Yes, but the abuse of this, could cause apps to use more battery (restarting the app means moving all the stuff to memory again, etc.)Pester
I really don't agree with it being like a web page. A web page runs 100% at the server so its accessible for all users at any time. But an app does run inside the user's terminal (eg mobile phone), and can be equvalient of "minimizing" in windows. In the same way people don't minimize when they are finished with something, same should apply to apps IMHO. Imagine a notepad app. If I want to continue on my old note, I press home button, and then return to the note later. But if I want to start on a fresh empty note. Then it should be possible to kill the app and then start fresh.Fogy
Totally agree with sebastian nielsen. As a user I can say that the big difference between mobile app and web app is that web app doesn't run on MY device and doesn't consume MY resources. So I don't care what it does after i leave it by closing browser tab. But when i finish working with app and i close it (e.g. any game or other "heavy" app) i really want to CLOSE it rigtht at the time. I don't want it leaving until OS decides to kill it.Abmho
The problem, I think, (also after having gone through this same thing) is not that different systems may require different mental models, but that there is not readily available a clean, concise description of exactly what the intended model of each system is. The documentation for a lot of these things is less than optimal and leaves much to frustrating innuendo. Having that available, and ready as a reference would, I think, be a tremendous help to many new app programmers.Geri
E.g. something that starts off like "Android, fundamentally, is rather different from other environments one may be used to such as the desktop PC, in terms of the conceptual model it employs, and hence requires a different paradigm when it comes to application design. In particular, ..." And which then sets the paradigm out on its own terms and then enumerates the key design points and strategies required.Geri
B
301

I'd just like to add a correction here for the future readers of this thread. This particular nuance has escaped my understanding for a long time so I want to make sure none of you make the same mistakes:

System.exit() does not kill your app if you have more than one activity on the stack. What actually happens is that the process is killed and immediately restarted with one fewer activity on the stack. This is also what happens when your app is killed by the Force Close dialog, or even when you try to kill the process from DDMS. This is a fact that is entirely undocumented, to my knowledge.

The short answer is, if you want to exit your application, you've got to keep track of all activities in your stack and finish() ALL of them when the user wants to exit (and no, there is no way to iterate through the Activity stack, so you have to manage all of this yourself). Even this does not actually kill the process or any dangling references you may have. It simply finishes the activities. Also, I'm not sure whether Process.killProcess(Process.myPid()) works any better; I haven't tested it.

If, on the other hand, it is okay for you to have activities remaining in your stack, there is another method which makes things super easy for you: Activity.moveTaskToBack(true) will simply background your process and show the home screen.

The long answer involves explanation of the philosophy behind this behavior. The philosophy is born out of a number of assumptions:

  1. First of all, this only happens when your app is in the foreground. If it is in the background the process will terminate just fine. However, if it is in the foreground, the OS assumes that the user wants to keep doing whatever he/she was doing. (If you are trying to kill the process from DDMS, you should hit the home button first, and then kill it)
  2. It also assumes that each activity is independent of all the other activities. This is often true, for example in the case that your app launches the Browser Activity, which is entirely separate and was not written by you. The Browser Activity may or may not be created on the same Task, depending on its manifest attributes.
  3. It assumes that each of your activities is completely self-reliant and can be killed/restored in a moment's notice. (I rather dislike this particular assumption, since my app has many activities which rely on a large amount of cached data, too large to be efficiently serialized during onSaveInstanceState, but whaddya gonna do?) For most well-written Android apps this should be true, since you never know when your app is going to be killed off in the background.
  4. The final factor is not so much an assumption, but rather a limitation of the OS: killing the app explicitly is the same as the app crashing, and also the same as Android killing the app to reclaim memory. This culminates in our coup de grace: since Android can't tell if the app exited or crashed or was killed in the background, it assumes the user wants to return where they left off, and so the ActivityManager restarts the process.

When you think about it, this is appropriate for the platform. First, this is exactly what happens when the process is killed in the background and the user comes back to it, so it needs to be restarted where it left off. Second, this is what happens when the app crashes and presents the dreaded Force Close dialog.

Say I want my users to be able to take a picture and upload it. I launch the Camera Activity from my activity, and ask it to return an image. The Camera is pushed onto the top of my current Task (rather than being created in its own Task). If the Camera has an error and it crashes, should that result in the whole app crashing? From the standpoint of the user, only the Camera failed, and they should be returned to their previous activity. So it just restarts the process with all the same Activities in the stack, minus the Camera. Since your Activities should be designed so that they can be killed and restored at the drop of a hat, this shouldn't be a problem. Unfortunately, not all apps can be designed that way, so it is a problem for many of us, no matter what Romain Guy or anyone else tells you. So, we need to use workarounds.

So, my closing advice:

  • Don't try to kill the process. Either call finish() on all activities or call moveTaskToBack(true).
  • If your process crashes or gets killed, and if, like me, you need the data that was in memory which is now lost, you'll need to return to the root activity. To do this, you should call startActivity() with an Intent that contains the Intent.FLAG_ACTIVITY_CLEAR_TOP flag.
  • If you want to kill your app from the Eclipse DDMS perspective, it had better not be in the foreground, or it will restart itself. You should press the Home button first, and then kill the process.
Bristol answered 9/1, 2010 at 15:59 Comment(12)
Actually, since I started with Android again I am finishing all activities (only one activity is active at any point in time), and then I call System.exit(0); in my Service - and that works just as I want it too. I know most ppl say "dont do that", but I get exactly the behaviour I want with that move...Reformer
Killing the process is very useful sometimes - for example when writing games which use native code. Killing the process means releasing all the allocated memory back to the system, immediately.Schlesinger
For anyone who cares, Process.killProcess demonstrates exactly the same behavior as System.exit()Mite
System.exit(0); / System.runFinalizersOnExit(true); / android.os.Process.killProcess(android.os.Process.myPid()); <- they are all the same.Overcloud
@Niel: Thanks for this gem of knowlege, and presenting it very clear and being totally practical about things. This will surely save me countless hours of experimenting with activity lifecylce properties.Kop
Derive all activities from a common AtivityBase. Then hold a flag to force close the app, in onResume check if the force close flag is set. If so call System.exit(0); This will cascade through the entire activity stack and finally get the app completely closed.Officiant
Thanks for providing actual answers (moveTaskToBack() was what I was looking for). So many people just say "No you're an idiot for ever wanting to exit your app." without even considering that there might be cases where you do want it (e.g. failed logins).Suilmann
Android can't tell if the app exited or crashed or was killed in the background - WTF? That's what process return codes are for! Did Android abandon those despite being linux-based?Backer
System.exit() terminates the linux process which is the Java Virtual Machine. I've used System.exit() and never seen the operating system automatically restart the linux process.. Maybe it's only on newer android?Colp
@Izkata, Android is never proud of being linux-based. If not for time constraints (since money is no problem for them) they would have wrote the whole thing from scratch.Nucleotide
Thanks for the info. Yeah when I started playing with android (2.3 I think) by then Android could tell the difference between a crash (like a divide by zero) which it reported as "Unexpectedly stopped" and a clean System.exit(0) which simply closed the JVM. That's why I'm really wondering why Android restarts on a clean System.exit(0) which should only happen intentionally, unlike a divide by zero which would be an unintentional crash. However, System.exit(0) from the main activity seems to still be a clean full app quit on 7.0.Colp
In response to my comment from 2013, now that I'm playing with android 7.0, I most definitely have seen it restart an app in response to a System.exit(0) -- but seems to only restart it if the System.exit() call was made from some other than the main activity. So strange. If app crashes, they tell you it stopped and offer to restart it. But if it performs a clean exit, they silently restart it.. my only question is a huge why??Colp
P
190

All of my applications have quit buttons... and I quite frequently get positive comments from users because of it. I don't care if the platform was designed in a fashion that applications shouldn't need them. Saying "don't put them there" is kind of ridiculous. If the user wants to quit... I provide them the access to do exactly that. I don't think it reduces how Android operates at all and seems like a good practice. I understand the life cycle... and my observation has been that Android doesn't do a good job at handling it.... and that is a basic fact.

Portaltoportal answered 9/1, 2010 at 15:59 Comment(14)
+1 because unfortunately it doesn't do such a good job at this point in time (but I still want to try do things as designed, so it puts me in a quandry)Mcmillan
What mechanism do you use to quit?Iodic
Well, consider this use case. I have an app that periodically checks for updates for a set of bundle apps including itself. Once the apps are all updated this app NEEDS to shut down completely to reflect the changes. Unfortunately finish() does not do that (and I have tested and have gone nuts over that). A mechanism is needed to completely shut down the app.Officiant
@Nar Why doesn't finish() do that? And what do you mean by "completely shut down the app"? If you want to pop all of your activities from the stack, then finish() should do it.Morganstein
@Igor - finish() is what I use most frequently. If your application has a service, it will restart if you explicitly kill it anyway.Portaltoportal
@Igor finish()-ing the activities does not kill the application (extends Application). So even when none of the activities were active the settings are still active and actual, such that when the activities try to access them they will be the ones that were used before. System.exit(0); on the other hand kills the Application, such that when started again the app will have to initialize the settings from anew. That's what I need when updating my application manually, because I frequently change the format of the data and I need them to be re-initied immediately.Officiant
@Nar That I understand. I am not sure if using System.exit(0) or Process.killProcess is recommended in a production app, though. But I could be wrong, and maybe there are plenty of apps that use that mechanism...Morganstein
Well, that's the only way to accomplish what I need at the moment. I use system.exit when the app is updated (otherwise I'll get serialization or class cast exceptions based on my code changes). I should mention though that I do not give the user a UI handle to kill the app via system.exit - it is reserved for me as the engineer of the app to be used only when the app absolutely needs to completely unload. The rest of the time a simple finish() (or the default back button operation) is used.Officiant
Yeah.. to hell with 'not android standard' .. Android is powerful coz, it enables people to experiment.. If it provides APIs to do something, how can one say that it is not Android standard? I cannot digest all those 'philosophical' answers. You make the app keeping in mind your users. if they are happy or if they want to see this feature, then it is absolutely fine to implement that even if those so called philosophers are against it..Mithgarthr
@RichardLeMesurier, Why is there a quandry? Why would you want to limit yourself to doing only things as designed? Indeed, for the sake of backward compatibility, things as designed will never have the needed space to evolve and thus they are either wrong now, or wrong in the future. Ask yourself, Do you want to be right or wrong?Nucleotide
@RichardLeMesurier, I've not misunderstood it: You stated that you are in a dilemma because part of you want to do things "as designed". And thus I stated: You don't need to. Because things as designed will never have the needed space to evolve and thus they are either wrong now, or wrong in the future. Ask yourself, Do you want to be right or wrong? Why is there a dilemma?Nucleotide
@Nucleotide Let's just say I agree with most of what is said in the highest voted, accepted answer, as written by an industry expert on this platform. My quandry comes in the fact that 3 yrs ago, the practice did not match the theory. --- However, I respect your right to ignore industry guidelines based on your experience - bearing in mind that "pull-to-refresh" was against guidelines back in the day, as was the "hamburger navigation drawer". These came about because ppl challenged the norm. Without pioneers (such as yourself, perhaps) we would never have these useful tools.Mcmillan
You know that users can just press the recents button and swipe your app to close it, right?Radian
Quit actions or buttons are UX antipatterns on mobile mainly because you are lying yo your users. Is like a door handle on a door that open and closes by proximity: you can please grandpas that can't understand the concept, but someday they will try the handle, and find out that is a fake. But you are also damaging the platform itself, if you don't follow the patterns and providie users with "tricks that work anywhere" (by Matias Duarte, UX lead on Google, words). Your app isn't an island, and we all building together a common place for mobile users.Liturgist
S
146

Stop thinking of your application as a monolithic application. It is a set of UI screens that the user can interact with your "application", and "functions" provided via Android services.

Not knowing what your mysterious app "does" is not really important. Let's assume it tunnels into some super secure corporate intranet, performing some monitoring or interaction and stays logged in until the user "quits the application". Because your IT department commands it, users must be very conscious of when they are IN or OUT of the intranet. Hence your mindset of it being important for users to "quit".

This is simple. Make a service that puts an ongoing notification in the notification bar saying "I'm in the intranet, or I am running". Have that service perform all the functionality that you need for your application. Have activities that bind to that service to allow your users to access the bits of UI they need to interact with your "application". And have an Android Menu -> Quit (or logout, or whatever) button that tells the service to quit, then closes the activity itself.

This is, for all intents and purposes exactly what you say you want. Done the Android way. Look at Google Talk or Google Maps Navigation for examples of this "exit" is possible mentality. The only difference is that pressing back button out of your activity might leave your UNIX process lying in wait just in case the user wants to revive your application. This is really no different than a modern operating system that caches recently accessed files in memory. After you quit your windows program, most likely resources that it needed are still in memory, waiting to be replaced by other resources as they are loaded now that they are no longer needed. Android is the same thing.

I really don't see your problem.

Shondrashone answered 9/1, 2010 at 15:59 Comment(10)
@Eric, You do not see the problem because you are running away from it. You simply utilized another program that runs on the old "program model" to do what can't be done by the "Android model". To see the problem with "Android model", you have to imagine that you don't have the luxury of delegating tasks to Linux/Windows boxes. You have to imagine that you are forced to do everything from the frontmostend to the backmostend with only boxes that run the "Android model". Then, you'll see that the limitations of the "Android model" are as clear as sky.Nucleotide
think of your application as a monolithic application. It is written in java which is being executed by a single JVM (Java Virtual Machine) process. System.exit() exits the JVM and completely and fully terminates all UI screens and everything. The exception to this is IF the programmer goes to the trouble of setting up multiple threads which run in multiple processes - but by default, such is NOT the case, and according to Google, should not be done normally.Colp
@JesseGordon This is just not true. System.exit() only removes an Activity from the stack. The JVM is immediately reinitialized. See this answer.Trevor
@Trevor Thank you for your comment. My statement, which I made 2 years ago, is true for the version of android I was working with then. I've been compiling my own linux desktop kernels for about 15 years and know my way around linux reasonably well, and I shelled into my android device and observed that (at that time, for that version of android) each app runs in its own JVM under a unique user ID and that System.exit() was indeed terminating the whole JVM which was running that app. I did not witness android restarting the jvm either.Colp
@Trevor PS, if you have shelled into your device and seen that System.exit() does not actually terminate the JVM for that app, or that things are otherwise different in your version of android, I would be most interested in hearing what you have discovered. I've been away from android programming for a couple years so I really don't know how they do it now, it could be different than it was. I do have an android 7 device now which is drastically more modern of an Android version than whatever I was working with back then, so maybe if I get a few minutes I see how its done now.Colp
@Trevor OK I've tested it on android 7.0. A simple single threaded app still runs in its own dedicated JVM instance, running as a user ID unique to that app. I did not try a multi-threaded app yet for this test. And System.exit() STILL kills the whole JVM for that app. If the System.exit() is called from the primary activity, it just exits. If System.exit() is called from a subactivity, the JVM is still killed, but android restarts it under a new process ID back at the main/first activity. android.os.Process.killProcess(android.os.Process.myPid()); and kill <pid> work the same way.Colp
@Trevor PS, I really don't know if it's a JVM or some other JIT/other scheme. But it's clear that multiple activities in a single threaded simple app all run in the SAME linux process, which only runs activities for that app, and that System.exit(), whether called from the main or a sub activity, does kill that Linux process. Android may restart it, but it will be a fresh new process running under a new process ID. Android also may remember some state data of the main activity and re-insert that after relaunching, but it's a completely fresh new process. Streamlining crashes they r.Colp
Interesting.. Looking over the answer you linked, @forresthopkinsa, it looks like Android is doing like web browsers, restoring the activities after a system.exit so the user doesn't notice it exited, but excluding the activity that caused the exit..? Weird. But anyway, System.exit() does close all activities and free()'s the memory and terminates the JVM for that app. But I have no idea what sort of antics Android does to restart/restore it. Is it to thwart app killer apps? So I guess if someone wants an exit button, they should put it in the main activity.Colp
Yeah, that pretty much sums up the link I included. Even though the process does technically get restarted, and adopts a new PID, the UI ends up being just as much present as before exit() was called.Trevor
And yeah, you're right, it is an odd practice, and not one that you would expect.Trevor
C
73

This is an interesting and insightful discussion with so many experts contributing. I feel this post should be looped back from within the Android development main website, because it does revolve around one of the core designs of the Android OS.

I would also like to add my two cents here.

So far I have been impressed with Android's way of handling lifecycle events, bringing the concept of a web-like experience to native apps.

Having said that I still believe that there should be a Quit button. Why? ... not for me or Ted or any of the tech gurus here, but for the sole purpose of meeting an end user demand.

Though I am not a big fan of Windows, but long back they introduced a concept that most end users are used to (an X button) ... "I want to quit running a widget when 'I' want to".

That does not mean someone (OS, developer?) will take care of that at its/his/her own discretion... it simply means "where is my Red X button that I am used to". My action should be analogous to 'end a call on pressing of a button', 'turn off the device by pressing a button', and so on and so forth ... it's a perception. It brings a satisfaction per se that my action indeed achieve its purpose.

Even though a developer can spoof this behavior using suggestions given here, the perception still remains i.e. an application should completely cease to function (now), by an independent, trusted and neutral source (OS) on demand from the end user.

Conker answered 9/1, 2010 at 15:59 Comment(8)
Right. Good ol' Windows Mobile offered the same X button as Windows PCs, except that it did not actually quit the app, it just "smart minimized" it. Many users probably never found out the app didn't really quit. (The approach worked great, although if you used .NET Compact Framework, the app was not notified that this had happened and so did not have the option to free resources or actually quit.)Lonnylonslesaunier
Really, this amounts to lying to your users to give them a warm, fuzzy feeling. Ultimately, it's better to let the relics of the past fall to the wayside, lest they continue to be permanent fixtures of technology. Mobile and web are new platforms, and aren't expected to behave the same as desktops. And anecdotally, at least, Android's lifecycle decisions seem to be catching on with users: as my biggest app passes its 2 year anniversary, I have noticed the stream of end-user requests for "exit" buttons drying up as they get used to the new platform.Winfredwinfrey
@Jon What do you recommend? Not offering an 'exit' option anywhere in the app?Morganstein
Well, when a user requested an exit button, I would explain to them precisely how things worked differently than on a desktop (which is the same explanation I give them when they mention task killers). Now, the information seems to have caught on, and I don't get those requests anymore. So, I recommend you explain it a few times (maybe come up with a canned response) and leave out the button. Or put in a fake exit button that pops a dialog explaining why there are no more exit buttons. :D (Also in Android 4+ a user can swipe an app "off" of the multitasking display to "kill" it.)Winfredwinfrey
Personally I've come to use the home button as an exit button, which I find to be equally satisfying to a red X.Urethroscope
I also haven't found the reasoning behind all the advice saying "don't kill the process". In my opinion, the customer is always right, so what's wrong with providing an exit button after it's been requested and "lying to your users to give them a warm, fuzzy feeling", if that's what they want? This is partly what writing good apps is all about. Most user don't know or care what's really going on under the hood, but if they like your app and it does what they want and expect, they'll come back and buy more of your apps. That's what we all want, isn't it? Or am I missing something?Granoff
You could say the same about dialog boxes in apps. On windows one would pop up with Ok and Cancel buttons. On apps, you generally just have a screen with a Done button. What happens if you start fiddling and then decide you don't want the changes. Tough, you just have to accept it.Publicness
This reminds me of how the "close doors" button in elevator works. It doesn't really close the doors any sooner, it's there to give the users a more sense of control. The problem with giving users what they want in regards of a "quit" button is that since a minority of apps do this, you risk creating confusion. Users might ask themselves the difference between tapping the quit button and tapping the back button. The beauty of Android (in my humble opinion) is that the OS takes care of so much and thus most apps you use are very consistent in look & feel and behaviour.Prolong
G
39

You can quit, either by pressing the Back button or by calling finish() in your Activity. Just call finish() from a MenuItem if you want to explicitly kill it off.

Romain isn't saying it can't be done, just that it's pointless — users don't need to care about quitting or saving their work or whatever, as the way the application lifecycle works encourages you to write smart software that automatically saves and restores its state no matter what happens.

Geophyte answered 9/1, 2010 at 15:59 Comment(10)
Its not pointless if it fills a purpose, and in our application it does just that. For example, we want to check updates when exiting the application. We cant exit the app, then no update can be made. Some comments suggest that hitting the back button does not kill the app at all (see link in my question above).Reformer
Another thing is that I dont want the application to quit just by pressing the BACK button. It should only terminate when the Users wants to terminate it - never ever any other way. If you cant write apps that behave like that in Android, then I think that android cant be used for writing real apps =(Reformer
As Romain says, it's not how the core applications work. So if users are used to pressing "Back" to quit an app, then it seems likely that they'll continue to do so with your app rather than explicitly choosing Quit? You could do an update check at startup, or onDestroy(), or using an repeating alarm.. it doesn't seem like something that requires to be triggered by a user.Geophyte
You have to remember that the Android isn't a PC - it's a phone. It has limited resources and needs the user needs complete control (placing emergency calls, for example). What do you mean by "real apps"?Decurved
What does the app do? If you don't want it to quit when the user hits back, use a service. If you do want it to quit, why do you care that the activity is still in memory? Why do you want to update the software on exit? The market app takes care of the updating the software for you.Scratchboard
Tom: I have been coding for Windows Mobile for almost 5 years now. Thats a phone to with "limited resources". There is no such behaviour there, and there is not problems that it doesnt act in that "big brother"-way either. "Real apps" = where the programmer has a lot more control over it, ie quitting, when GUI-stuff is removed etc...Reformer
Jay: because if its still in memory, I cannot update the app Im thinking. Cant delelte files that are in use, right? I want to update on exit because we cannot force our users to update on start. That has to do with how they work and what they need. Its not OK for them to be forced an update at the start of their shift for different reasons. Its a bit complicated.Reformer
Jay: No, as I stated aboive it is NOT an Market App, and its not going to be that either. Its a very specialized app, not for general use.Reformer
It's a separate question in itself, but you can download the updated APK in the background at any time and show a system notification prompting the user to update, or force its installation during app startup. Installing an update is very quick and you don't need to make any assumptions about apps running/files open because, as you know, components on Android are notified when they need to shut down so state is always saved.Geophyte
In recent versions of Android, hitting Back enough times may cause the app to disappear, but it may still be running (returning to it from the recent apps list does not restart the app). The only way I've found to reliably quit an app (besides shutting down the device) is to go to the Recent Apps list and close it there, by tapping the X or swiping the app sideways.Fuller
B
32

This debate boils down to the age-old question of whether the developers know best or whether the user knows best. Professional designers in all areas of human factors struggle with this every day.

Ted has made a point in that one of the most downloaded apps on the Market is the 'App Killer'. People get a bit of extra serotonin when they quit applications. They're used to it with a desktop/laptop. It keeps things moving fast. It keeps the processor cool and the fan from turning on. It uses less power.

When you consider that a mobile device is a much smaller ship, then you can especially appreciate their incentive to 'throw overboard what you no longer need'. Now the developers of Android have reasoned that the OS knows best and that quitting an app is antique. I wholeheartedly support this.

However, I also believe that you should not frustrate the user, even if that frustration is borne out of their own ignorance. Because of that, I conclude that having a 'Quit' option is good design, even if it is mostly a placebo button that does nothing more than close a View.

Box answered 9/1, 2010 at 15:59 Comment(6)
Yes, having a 'Quit' button is indeed user-friendly. How else would the user quit the app if he is 5 activities deep into it? Sure they can press back multiple times, but I don't think they'd like that.Morganstein
Only 5? The Android 2.2 web browser makes me spend a few minutes tapping the back button until I eventually exitLanctot
I would start listening to developers of android when they develop memory manager that WORKS. As of Froyo, it worked extremely poorly, killing off random apps, re-starting apps that don't need to be (and have no Intents to start them legitimately), and OTOH, slowing to a COMPLETE crawl when memory hits 50MB free.Hubbub
When your religion says that Android Task Killer is "un-necessary", but using ATK to kill off dumb tasks that have no business running changes the OS from crawling at ~1-5% of normal speed back to 100% of normal speed (measured) 100% of time across 1000s of ATK usages over 2 years everytime the system hits 50MB free low end, your religion is wrongHubbub
@JoePlante You can close all the open tabs and windows first and then simply press the back button once to quit :) At least on my GS2 that is.Grafting
@Logan Dam: No tabs on the 2.2 browser I used, my friend.Lanctot
B
31

Ted, what you are trying to accomplish can be done, perhaps just not how you are thinking of it right now.

I suggest you read up on Activities and Services. Stop using the term "app" and start referring to the components, i.e. Activity, Service. I think you just need to learn more about the Android platform; it is a change in mindset from a standard PC app. The fact that none of your posts have had the word "Activity" (short of a FAQ quote, i.e. not your words) in them tells me you need to read some more.

Box answered 9/1, 2010 at 15:59 Comment(2)
Ive read most of the stuff on android.com =) and I can link to several of my questions where I talk about Activities, so thats not true (ex: #2032835 or #2032835 etc...) However, I might give it one last go, and try to create the who "app" as a Servce...Reformer
An app can contain Services and Activitys, and it sounds like your app may need both. The activity is only the UI part.Maturation
C
25

Answer: (Romain Guy): The user doesn't, the system handles this automatically. That's what the activity lifecycle (especially onPause/onStop/onDestroy) is for. No matter what you do, do not put a "quit" or "exit" application button. It is useless with Android's application model. This is also contrary to how core applications work.

1: Totally exiting an application may be generally unmandatory, but it is not useless. What if windows had no exit option? System would be doggy slow as memory was full and the OS had to guess at which programs you were done with. I don't care what Romain Guy or even Larry Page and Sergey Brin say - these are unquestionable facts: Systems run slower when they have to kill tasks to get their memory before a new app can be launched. You just can't tell me that it doesn't take time to kill an app! Even the light from distant stars take time... There is some use in allowing the user to fully close apps.

2: Contrary to how core applications work? What's that supposed to mean? When I'm done running an app for now, it is no longer doing any work...It's just waiting to be killed by the OS when its memory is needed.

In summary, there is a distinct difference between minimizing and exiting, and neither pinch hits well for the other. Do we leave a screwdriver in every screw? Or a key in every door? Do we leave all of our appliances on high until the breaker blows and we need to turn on another appliance? Do we leave the dish washer full of dishes, and only take out enough each time to make room for some new dirty ones? Do we leave all the cars running in the driveway until -- oh never mind.

If the user wants to minimize an app, then the best thing is to minimize it. If a user wants to exit an app, then by all means it is best to exit.

Is it frowned on? That's Android's view - they frown on it. And many many independent rookie Android developers frown on it.

But when it comes right down to it, there is good coding and bad coding. There is good program flow models and there are bad program flow models.

Leaving programs in memory when the user knows they are done with them simply is not good program flow. It serves absolutely no purpose whatsoever, and it slows things down when launching new apps or when running apps allocate more memory.

It is sort of like your car: There are times when you leave it running, like stopping at a stop light, or perhaps the fast food drive through, or stopping at the ATM. But there are other situations where you do want to shut it off - like when you get to work, or the grocery store or even home.

Similarly, if you're playing a game and the phone rings, yes. Pause the game and keep it running. But if the user is done with the game for a while, then by all means let them exit.

The exit button on some applications should be more out in front than others. Games, for example, or programs where the user is likely to want to fully exit, should have an obvious exit. Other programs, like, perhaps, email programs, where exiting is an unlikely desire (so that it can keep checking for email) -- these programs should not waste prime control input screen space with an exit option, but for good program flow, it should have an exit option. What if someone decides they don't want their mail program trying to check email when they are in poor coverage area, or maybe in a Skype call or whatever? Let them exit the email program if they want!

Suspending and exiting are two vital tasks and neither fulfills the role of the other.

Colp answered 9/1, 2010 at 15:59 Comment(5)
"If the user wants to minimize an app, then the best thing is to minimize it. If a user wants to exit an app, then by all means it is best to exit." - There is a thing (based on more that decade of experience): users rarely knows, what they want. If you do not help them, you will have to change it. About samples above: let me give you other sample: you are working on a car and have a table at hand for things. Do you always put away to correct place all necessary tools to cabinet or keep the most used ones at hand? And just put away a big late used one to have place for new ones?Marcimarcia
HoGo, thanks for your comment. Naturally, I do disagree. Specifically, as best as I can tell, your view is that since some users don't know what they should do, therefore don't let any users do what they should do, not even the ones that know what they should do. If android had a way to accurately know whether it should terminate an app instead of minimizing it, then fine. But it doesn't, and forcing all users to always live with minimization when they want to exit leads to poor device performance.Colp
The thing is, the system know that when you start one app and there's no memory it should kill the last one. The user shouldn't know that. You only want it because you are a human that like the felling of being in control, its just stupid muscle memory, its even pointless control having to closing programs. Computers were invented to automate, I would like more for Windows to work like Android and just close automatically for me, but I have to remember to save and quit, that's silly, why should I, the user do that? computers should manage their memory, I have other things to manage.Elgin
Actually I don't close programs in my Windows machine, I have 32GB of RAM, I just leave everything running, I close them when I finish my work. Why close the program, to open it again 5min later, this makes no sense. Think of a large C++ project that takes 2min to become responsive, I just leave the Visual Studio open forever. And I expect it to also not crash from 15 days of being open (and yes, I use ECC memory for that).Elgin
The analogy with the machine shop is a good one, I also leave the most used tools on top of my desk, I don't pick the tool, use it, and put it back every single time. Also, I don't start the day, turn on the computer, wait for it to start, open IDE, whatever. I just leave it running, modern computer can idle at 40w, why closing? it also wears less the components (no inrush current, EEs knows it :) )Elgin
A
25

Blog post When to Include an Exit Button in Android Apps (Hint: Never) explains it far, far better than I can. I wish every Android developer has read it already.

Excerpts:

In my experience what [the users] really want is: An unambiguous way to guarantee that an app will stop consuming resources (battery, CPU cycles, data transfer, etc.).

Many users perceive that an exit button implements this requirement and ask for it to be added. Developers, looking to please their users, obligingly add one. Shortly thereafter they both fail.

  • In most cases the exit button simply calls Activity.finish(). This is exactly equivalent to hitting the back button. Exactly. Services keep running and polling keeps happening. Users may think they've killed the app but they haven't, and soon they'll be even more annoyed.
  • Exit behavior is now ambiguous. Should your exit button just close the Activity, or should it also stop all associated Services, Receivers, and Alarms? What should Back do? What happens if they hit Home instead? What happens if your app has a widget? Should the exit button stop that from updating too?

The solution is to make the back button behave as you'd expect the exit button to. Better yet, simply stop consuming resources whenever the app isn't visible.

Go ahead and read the complete article.

Algeria answered 9/1, 2010 at 15:59 Comment(7)
Exit and Back are not always used for the same purpose. Take, for example, Pandora. When you hit back to get out of this app, it doesn't exit the app (keeps it playing in the background as a service).Morganstein
@IgorG. A music player app needs a "Stop" button to stop playing music, not an "Exit" button to exit the app.Parting
Have you ever used Pandora, iHeartRadio, Spotify, Jango and other music streaming apps? They all have a quit button. Stopping music play is NOT THE SAME THING as quitting an app. Especially if you have a service running in the notification bar.Morganstein
@IgorG. I'm sure all those apps implement their so called Exit button by simply stopping their service that plays music and perhaps by finish()ing the activity. It is just that they have chosen to call this button as 'Exit' or 'Quit' to pander to the ignorant users who demand such a button and to give them that warm, fuzzy feeling of completely obliterating the app. How else do you think this mythical quit button is implemented? Using System.exit()???Parting
Mythical or not, primitive users or not, but almost every UI software ever written - on any platform and OS - implements a quit/close/exit button. How else would you implement it?Morganstein
@DheerajV.S., Simply stop consuming resources whenever the app isn't visible? Bad advice. Very. Very x99. Whenever I try to email myself a photo, I have to keep the app visible for a full 5 minutes because if I minimize it, it stops emailing the photo. Correct, I can't use my phone for a full 5 minutes just because of some developer who thinks apps should run only when visible. Now imagine sending a larger file like video.....Nucleotide
At 8tracks I basically renamed the button to Shutdown. When used, I stopped media players (and released them), killed the music service with stopSelf(), cleared up some memory caches and finished the activity stack. Finally I did a system.exit. It's hacky but it works. Android users are annoying with these fake task managers and "OMG I SEE YOUR PROCESS RUNNING, MY CRAPPY BATTERY IS GONNA LAST LESS NOW!" even tho the service does "nothing" if you are not playing. Anyway, happy users = happy devs. ;)Pester
D
19

If you are unable to fathom how to make your data/connections (and thereby your "application") persistent, then you will be unable to do what you "need" to do with Android.

Those who do download those cutesy little App Killers usually find they do not help battery life or memory usage, but hinder the OS from doing it's job of managing memory efficiently...

http://android-developers.blogspot.com/2010/04/multitasking-android-way.html

Detestable answered 9/1, 2010 at 15:59 Comment(8)
While we're talking about task killers, a very enlightening post appeared on the Android reddit a couple of days ago. The gist is, use task killers carefully or you could actually end up hurting your battery life: reddit.com/r/Android/comments/cwhm6/…Bristol
@Neil Traft, I found the comments on the post very enlightening. Sales reps in the stores are recommending and installing task killers for their customers :)Azurite
@Dan, How is it even remotely possible that me fully exiting an app that I'm done with for a week hinder Android OS from its job? So there's more free memory. That can't possibly hinder android! It sure could speed things up later, though! If I know I'm done with the app for a while, it serves absolutely no purpose whatsoever. It only takes up memory, and sooner or later, I will launch a new app and the OS will have an added delay because it has to go kill some apps that I knew WEEKS ago that I was done with.Colp
@Jesse Gordon, Have you watched the actual processes after you killed an app? They get restarted, the OS assumes there was a problem... The OS will kill apps when it needs memory. Did you even read anything posted in the articles mentioned around here?Detestable
@Dan, To think that Android would do something like this.... it really needs some serious white-washing re-education.Nucleotide
@Dan, I haven't messed with android coding since 7, but I can tell you at least up until and including that point in time, I can tell you as a command line level linux user for 23 years, Android runs Linux, and each app runs in (by default) a single JVM, and the JVM is a regular Linux process. System.exit() in your main activity terminates the ENTIRE JVM running a single-thread app and all the app's memory is freed. It does not restart it. I used the debug shell and top or ps to verify that the app was closing and not restarting.Colp
@JesseGordon Please note the date of this answer and the source of the response - As a CLI Unix user and Linux for over 30 years, I know what you're saying, but I was only quoting the direct source... I can also tell you if you didn't profile it for memory leaks back then, this is truly a thread from the dead... The Handler pattern in use back then literally caused memory leaks because Messages would be sent to stale Activities. I would rather hear about the C.Detestable
@Dan, yeah I know it's an old thread, and I don't know why they didn't notify me of your 2013 response till 2022. But you ask me if I had watched the actual processes and you told me that the apps get restart if they are killed, and your question and statement both deserved a response - Yes, I have watched the actual processes in TOP and PS, and it's not true that they always restart, at least for the version I was working with at the time. Maybe it's different now, I haven't worked with anything newer at that level. Cheers!Colp
S
18

I think the point is that there is no need to quit the app unless you have buggy software. Android quits the app when the user is not using it and the device needs more memory. If you have an app that needs to run a service in the background, you will likely want a way to turn the service off.

For example, Google Listen continues to play podcast when the app is not visible. But there is always the pause button to turn the podcast off when the user is done with it. If I remember correctly, Listen, even puts a shortcut in the notification bar so you can always get to the pause button quickly. Another example is an app like a twitter app for instance which constantly polls a service on the internet. These types of apps should really allow the user to choose how often to poll the server, or whether even to poll in a background thread.

If you need to have code that runs on exit, you can override onPause(), onStop(), or onDestroy() as appropriate. http://developer.android.com/reference/android/app/Activity.html#ActivityLifecycle

Scratchboard answered 9/1, 2010 at 15:59 Comment(7)
Along with other messy things I discovered, I think that developing our app for Android is not going to happen. Its too much "big brother"-thing going on, where Android tells me what app that should be running or not. I as a programmer should have that choice, not google or android =(Reformer
Your Activities -- the active user interface -- go away when another application comes on top, or you press back or whatever. The user's not interacting with them, so it's safest to save the state in case the user doesn't come back for a long time, and so on, as you know. There's nothing stopping you from writing a Service though to keep ongoing work happening in the background, like receiving data pushes or whatever. Google Talk doesn't stop working when you're using a different app. Same with the Music player. Look at the other apps out there and how they work.Geophyte
Before I finally give up on Android, I will take a close look at the Service approach =)Reformer
You should be able to save the credentials so users don't need to log in every time they get a phone call or go away from your app. I would recommend looking at Android's lifecycle. When the app gets paused, stopped, or destroyed, you can save all relevant data so when the app opens again, it will be as they left it. The user doesn't even need to know that the app was ever stopped.Scratchboard
I can imagine that a user may want to quit some really resource intensive applications. Maybe it should just reduce its use of resources when it is paused, but that might not always be possibleBiggerstaff
@Ted, So how is it going with you and Services?Nucleotide
This questions is alive still I see, 4 years after I brought it up =) I did indeed run it as a service in the background, but I have added the quit-button, since I still feel - 4 years later - thats its necessary and important. And I see more and more apps that has that too (Skype for example).Reformer
P
17

Almost 99% of the time there is no need for an Android application to take over its own life cycle. Most of the time it comes down to better planning or smarter design of the application. For example, rather build an internal service (not exported) to handle downloads, etc., or design actions and tasks around user workflow.

But that being said, where there is a will there is a way. Android provides - through the android.os.Process class, a much better API than Java to control the underlying process. And unlike Java it does not treat the developer like a moron by hiding it all behind a simple java.lang.System.exit() call.

So how do you ask your application to commit suicide in Android? Well, the trick is simple:

Create your own Android application class by inheriting from the standard android.app.Application class (remember to declare it in the AndroidManifest.xml file).

Override the onCreate() method, and store the process ID which started your application:

this.pid = android.os.Process.myPid(); // Save for later use.

Now to kill your application, provide a kill() method:

android.os.Process.sendSignal(pid, android.os.Process.SIGNAL_KILL);

Now whenever you need your app to commit suicide just type cast the application context, and call your kill method!

((MySuicidalApp) context.getApplicationContext()).kill()

Just remember that due to the process management policies in Android, specifically related to services, Android may just opt to restart your service (see You should not use task killers on Android).

Priapus answered 9/1, 2010 at 15:59 Comment(1)
yep, I only came here because I wanted to close my app in one situation it makes sense, my OBB data cache is corrupt and I need to restart the entire AppElgin
B
17

I would consider reading "Android Wireless Application Development" published by Addison-Wesley. I am just finishing it up and it is VERY thorough.

It appears that you have some fundamental misunderstandings of the Android platform. I too was a little frustrated at first with the application life-cycle of Android apps, but after coming to a greater understanding, I have come to really enjoy this approach. This book will answer all of your questions and much more. It really is the best resource I have found for new Android developers.

Also, I think you need to let go of a line-for-line port of the existing app. In order to port your application to the Android platform, some of the application design is going to change. The application-lifecycle used is necessary as mobile devices have very limited resources relative to desktop systems and allows Android devices to run several applications in an orderly and resource-aware fashion. Do some more in depth study of the platform, and I think you will realize that what you are wanting to do is entirely feasible. Best of luck.

By the way, I am no way affiliated with Addison-Wesley or any person or organization associated with this book. After re-reading my post I feel that I came off a little fanboyish. I just really, really enjoyed it and found it extremely helpful. :)

Box answered 9/1, 2010 at 15:59 Comment(3)
Thanks for the book tip. I will take a look at it if I can and if I decide to move on the the Android port. Just to state it again though: our users are not very up-to-date when it comes to computers. I will be very hard for them to use for example the NotificationBar in Android. Too small (they have BIG fingers hehe). Its a different world for them, so we need to keep it simple and without options for the user. We built our .NET-solution with that in mind - dont give them a choice =)Reformer
I hear that. You have to assume most users are not very tech smart.Oligopsony
I get so tired of the mantra of how little "resources" a mobile device has. Wake up, they are running on over 500Mhz and has loads of memory. My old Dell Axim had 128MB of RAM. The current devices out there have usually over 512RAM and running on 1GHZ! That is 10 times more than my old Pentium 90Mhz, and I didnt hear ppl saying "the very limited resources" this and that. Its time to wake up and smell the coffee - we are in the 2010 now, not the 80ies.Reformer
T
15

When I conceive an application in Android, I see it this way:

  • You are working with your application
  • The phone rang
  • You take the call
  • At the end of the call, you come back to your application at the same place you were

To do that, you only need the Back button or the Home button of your phone (either by short or long press) and the notification bar.

When I exit my application, I only use the Back button until I am out of it or the Home button.

That's how most of the applications are conceived I think. But if I need some sort of session or connection, I made it clear to the user with a login/logout button and notification (title bar or anything else). This is a rather different style than the pure "exit" style application.

On PCs, you have a multi-GUI desktop, and on Android, you obviously have multi-tasks, but you only display one app at a time (I don't consider widgets here ^^). And on a mobile phone, at anytime, you could have a notification for something more important than what you are doing.

So the whole concept of an application rely on something different that "enter application - work - exit application".

Tranche answered 9/1, 2010 at 15:59 Comment(0)
E
12

Hmmmm...

I think that you just don't see the Android app the right way. You can do something almost like what you want easily:

  • Do the app activities save/restore state like it is encouraged in the developer livecycle documentation.

  • If some login is needed at the restore stage (no login/session information available) then do it.

  • Eventually add a button/menu/timeout in which case you will do a finish() without saving the login and other session info, making implicitly the end of app session: so if the app is started/brought to front again it will start a new session.

That way you don't really care if the app is really removed from memory or not.

If you really want to remove it from memory (this is discouraged, and BTW for what purpose?) you can kill it conditionally at the end of onDestroy() with java.lang.System.exit(0) (or perhaps restartPackage(..)?). Of course do it only in the case where you want to "really end the app", because the onDestroy() is part of the normal lifecycle of activities and not an app end at all.

Electrotechnology answered 9/1, 2010 at 15:59 Comment(0)
D
11

As an Application in an Android context is just a bunch of vaguely related Activities, quitting an Application doesn't really make much sense. You can finish() an Activity, and the view of the previous Activity in the Activity stack will be drawn.

Decurved answered 9/1, 2010 at 15:59 Comment(2)
Quitting an application sure can make sense in some situations. If it is a program that you use a few times a month for a few minutes, there is unquestionable benefit to exiting fully the app. That benefit is that the OS won't have to take the time to exit that app a week later when its out of memory and your phone rings and you've pressed the answer button, and you're waiting for android to free some memory so you can answer your call, for example. Or perhaps you got an email and you want to read it - any application that needs more memory will launch quicker if the OS doesn't first free it.Colp
What @JesseGordon said, and another aspect to this reason why quitting makes sense: if I don't exit this resource-intensive app I know I'm not going to use again for a month, the OS will sometimes wrongly kill some other app when resources get scarce, while leaving this useless resource hog app running... making that other app take longer to resume than it should.Immerge
G
10

The Linux kernel has a feature called Out-of-memory killer (as mentioned above, the policies are configurable at the userspace level as well as the kernel is not an optimal one, but by no means unnecessary).

And it is heavily used by Android:

Some userspace apps are available to assist with these kill apps, for example:

Glovsky answered 9/1, 2010 at 15:59 Comment(0)
A
10

I hope things will change over time. The user should be able to kill an app or process if the app process is sandboxed correctly by the OS. There is a notion that apps should be written perfectly or user will use only the apps that follow all SDK recommendations. I think that is a tall order.

Azurite answered 9/1, 2010 at 15:59 Comment(1)
I know. Apple products are good for some consumers. They are not good for developers. Android OS has full potential to become like the "Windows OS of the PC world" for mobile phones. may be even better. It is already more open than windows of the PC world, except it is not allowing us to write a task manager.Azurite
J
10

I agree with Ted. I understand that exiting the application is not the "Android way", but it doesn't seem like it should be precluded. Here are three reasons why you might want a real exit to the application (not just the activity):

  1. The user might want some control over which app gets killed in the case of low memory. If important app A is running in the background, then you might like to exit app B when you are done with it so that app A doesn't get killed by the operating system.

  2. If your application has sensitive data cached in memory, you might like to kill the app so that a virus/worm/rogue app can't get at it. I know the security model is supposed to prevent that, but just in case...

  3. If your application uses resources (like network, CPU, sensors, etc.) that could adversely affect the phone, then one way of ensuring that those resources are freed up is to exit the application. I understand that well-behaved apps should free up resources when they are not needed. But again, exiting the application seems like a reasonable way of ensuring that.

Jayejaylene answered 9/1, 2010 at 15:59 Comment(7)
What do you think represents the "application"? If I open the Facebook app, and set a new profile pic - my Camera or Gallery apps start up. As a user, I'm still performing the same task (using Facebook). If I then decide to close Facebook, my Camera and Gallery apps have to close too (since they are activities launched from Facebook)... What if I was in the middle of editing some of my other pics and had only intended to close Facebook? You would have shifted the problem to potential data loss.Aerate
Well, I don't think it could go as far as data loss. If you have a third-party activity running in the same task as your own activity, and your own activity is the one with the exit button, then the user has to finish() the third party activity before he can hit the exit button. And the third party activity should be saving any unsaved information at that time. I don't think you can use the app switcher to return to the exit button activity unless it's running in a separate task. And if it's a separate task, it's a separate process, and therefore won't be killed by the exit button.Bristol
In my mind, the "application" is the underlying linux process that is running all of my activities. But I am not an android guru so maybe my understanding is flawed. I write fortran number crunching code in real life, so maybe I am just a dinosaur.Jayejaylene
1. I think 99.99% of Android users should not worry about how the OS manages applications behind the curtains. The rest are geeks and will find advanced tools do make the system behave exactly how they want. 2. You can always unload any sensitive data when the activity gets paused or stopped. 3. Same as above, resources can be freed in lifecycle callback methods. When the activity resumes, resources can be allocated again.Inkerman
I think its rather interesting that sooo many Android users are installing "Advanced Task Killer", an app that closes down other apps since you normally cant do it yourself. I use it all the time myself. Quitting an app is not something I feel you can do without.Reformer
@ZsoltTörök, 99.99% of people deal with slow computers/phones and are forced out of choice to worry about how the OS manages applications behind the curtains.Nucleotide
I agree with this answer, and can think of several more. For example, when I use my Android, I don't want bunches of apps filling the list of apps that are loaded, so I can find the ones I want easily and not be distracted. Also, I don't necessarily want people I show my phone to to see the apps I have been running. I also LIKE the traditional application model's inclusion of a way to close apps and return to a starting point when I want to re-load them. Also apps don't necessarily do nothing when not in the foreground, and I many apps do stuff I don't want being done on my phone, Etc etc etc.Epigrammatize
W
9

The Android application life cycle is designed for mobile phone users, not computer users.

The app life-cycle is the brutally simplistic paradigm required to turn a Linux server into a consumer appliance.

Android is Java over Linux, a real cross-platform server OS. That is how it spread so quickly. The app life-cycle encapsulates the underlying reality of the OS.

To mobile users, apps are just installed or not installed. There is no concept of running or exiting. In fact, app processes are meant to run until the OS releases them for their held resources.

Since this is Stack Overflow, anyone reading this is a computer user and must turn off 90% of their knowledge to understand the mobile app lifecycle.

Wimmer answered 9/1, 2010 at 15:59 Comment(2)
I don't follow your leap to "computer users must turn off 90% of their knowledge". Yes, that's what Romain Guy says, but that doesn't make it true. It seems to me an "Advanced options for computer users" section, with a "Quit" button, would serve everyone's needs.Immerge
I have no idea who this "Romain Guy" is, or why he is quoting me. Closing recent tasks will quit the app, as does stopping from app info. ADB allows shell access for advanced users.Wimmer
B
9

You apparently have found the answer you want in the finish() command. This will not remove your app from memory, but Android will do so whenever it needs the resources, so it doesn't make any difference that you won't be doing that explicitly.

I would only add that in order to attain the full effect that an application exit would typically have, you would want to reset the app's state to whatever its state is normally at the time it is first run after a boot of the device, just prior to calling finish() on all of your activities. That way, if the user selects your app again, it will appear to have been run "fresh," without any state left over from the point prior to the simulated "exit."

If there are some special actions that should only occur on "exit," such as saving the user's work or whatever, you can also perform them prior to the re-initialization part of the above routine.

This approach allows you to accomplish your goal of having an "exit" command without violating Android's philosophy of leaving the management of OS resources, including the closing of apps, in the hands of the operating system.

Personally, I would not use this approach, because Android users expect an app to preserve its continuity when they revisit it, and so they are not used to the modality of "exiting" an app. I would instead support a "clear" function that a user can invoke to reset the app to some default initial state, without the necessity of "leaving" it in the process.

The one exception would be when the user has hit the back button a sufficient number of times to cause the app to close. In that situation, there is no expectation on the user's part that state will have been saved (and if there is unsaved state in the app, then you, as the developer, should have code handling the back button that detects that unsaved data, and prompts the user to save it to SharedPreferences or to a file, or to some other non-volatile medium).

Regarding system.exit(0):

If you do decide to use system.exit(0) to close your app with rude finality (e.g., as a result of a final back button press), then I would warn you that although for me this "works," and in some cases has been the only way I've been able to close an app without any trace of it remaining, there is one minor glitch that occurs in Jelly Bean when you use this approach.

Specifically, if you use the Recent Apps list to open your app, and then use the back button to close the app (with that close implemented via system.exit(0)), the Recent Apps list will become visible again, as it will never have been closed. If you then tap on your app's entry in that list to run it a second time from the same, already-open, Recent Apps list, there will be no response.

I suspect that the cause of this is that the Recent Apps list is holding on to a reference to your app that has become non-functional due to your having closed the app using system.exit(0). A more civilized closing of your app using finish() might have informed the OS in a manner that would have allowed it to refresh its Recent Apps list, but system.exit(0) apparently does not do this.

This is not a huge problem in and of itself, as very few people will open an app from Recent Apps, then exit it, and then immediately open it again from the same open Recent Apps list. And if they tap the home button and then re-open the Recent Apps list, your app's entry will be there, and it will be fully functional. But I think that it shows that the use of system.exit(0) can interfere with proper communication between your app and the OS, and this suggests that there may be other, more serious, possibly subtle, consequences of using this approach.

Bucharest answered 9/1, 2010 at 15:59 Comment(1)
You could perhaps remove the recent apps entry before calling finish()? This is something I will try out when time allows. I have a foreground Service with a small launcher Activity. As the Activity is very small, it is no big deal if it isn't killed and buried, but it makes sense to tell Android it can take this one before the rest, if possible.Ciliolate
L
7

First of all, never never never use System.exit(0). It is like making a person sleep punching him on the head!

Second: I'm facing this problem. Before sharing my solution a I want to share my thoughts.

I think that an "Exit Button" is stupid. Really really really stupid. And I think that users (consumer) that ask for an exit button for your application is stupid too. They don't understand how the OS is working and how is managing resources (and it does a great job).

I think that if you write a good piece of code that do the right things (updates, saves, and pushes) at the right moment and conditions and using the correct things (Service and Receiver) it will work pretty well and no one will complain.

But to do that you have to study and learn how things works on Android. Anyway, this is my solution to provide to users an "Exit Button".

I created an Options Menu always visible in each activity (I've a super activity that do that).

When the user clicks on that button this is what happens:

Intent intent = new Intent(this, DashBoardActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

SharedPreferences settings = getSharedPreferences(getString(PREF_ID), Context.MODE_PRIVATE);
SharedPreferences.Editor editor = settings.edit();
editor.putBoolean(FORCE_EXIT_APPLICATION, true);

  // Commit the edits!
editor.commit();
startActivity(intent);
finish();

So I'm saving in SharedPreferences that I want to kill my app, and I start an Intent. Please look at those flags; those will clear all my backstack calling my DashBoard Activity that is my "home" activity.

So in my Dashboard Activity I run this method in the onResume:

private void checkIfForceKill() {

    // CHECK IF I NEED TO KILL THE APP

    // Restore preferences
    SharedPreferences settings = getSharedPreferences(
            getString(MXMSettingHolder.PREF_ID), Context.MODE_PRIVATE);
    boolean forceKill = settings.getBoolean(
            MusicSinglePaneActivity.FORCE_EXIT_APPLICATION, false);

    if (forceKill) {

        //CLEAR THE FORCE_EXIT SETTINGS
        SharedPreferences.Editor editor = settings.edit();
        editor.putBoolean(FORCE_EXIT_APPLICATION, false);

        // Commit the edits!
        editor.commit();

        //HERE STOP ALL YOUR SERVICES
        finish();
    }
}

And it will work pretty well.

The only thing that I don't understand why it's happening is that when I do the last finish (and I've checked: it's following all the correct flow of onPause → onStop → onDestroy) the application is still on the recent activity (but it's blank).

It seems like the latest intent (that has started the DashboardActivity) is still in the system.

I've to dig more in order to also remove it.

Lamarckism answered 9/1, 2010 at 15:59 Comment(4)
Not many consumers know what an OS is let alone how one works, this does not make them stupid. Wanting an Exit/Quit/Off button makes them normal. When you leave a room you turn off the lights, more importantly when you leave your house you lock the door and this is where I see the problem with the inability to properly exit a program. Leaving the program alive in the background is a big security risk.Fourpence
"I think that a "Exit Button" is stupid". Most software applications provide an exit button.Morganstein
You said "//HERE STOP ALL YOUR SERVICES" and then used finish(). Android services do not have a finish() method. They have unbindService(mConnection);Morganstein
@Fourpence If you have a room that automatically turns off all of its lights and lock your door when you leave, you don't need to care about it.Foal
G
7

For closing an app at any point use FLAG_ACTIVITY_CLEAR_TOP flag in Intent and then system.exit();

Or there is similar way, but without system.exit() when you want to exit call this method:

public void exit() {
    startActivity(new Intent(this, HomeActivity.class).
    setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | IntentCompat.FLAG_ACTIVITY_CLEAR_TASK).putExtra(EXIT_FLAG, true));
}

In your HomeActivity.onCreate() add following code

protected void onCreate(Bundle savedInstanceState) {
    if (getIntent().getBooleanExtra(EXIT_FLAG, false)) {
        if ((getIntent().getFlags() & Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY) == 0) {
            finish();
        }
    }
......................

This will work without breaking the Android life-cycle.

Geoff answered 9/1, 2010 at 15:59 Comment(0)
T
7

There is a (relatively) simple design which will allow you to get around the "exit" conundrum. Make your app have a "base" state (activity) which is just a blank screen. On the first onCreate of the activity, you can launch another activity that your app's main functionality is in. The "exit" can then be accomplished by finish()ing this second activity and going back to the base of just a blank screen. The OS can keep this blank screen in memory for as long as it wants...

In essence, because you cannot exit out to OS, you simply transform into a self-created nothingness.

Tempered answered 9/1, 2010 at 15:59 Comment(2)
Good idea. However, even finishing a Activity (or Service) doesnt stop the OS. Oh no, even after the onDestroy has been executed all variables and stuff still is there. I just saw that in a Service, everyting is the same even though the onDestroy was called...Reformer
... and thus System.exit(0) helped out =)Reformer
B
7

Without an exit function for the application developer to kill their own application it is very bad design.

My application needs to allow the user to dynamically change data dynamically during runtime and the user needs to restart my application to make the change effect, but Android did not allow my application restart by itself. Android OS has a very bad design application life cycle.

Box answered 9/1, 2010 at 15:59 Comment(2)
public void appRestart() { Intent i = new Intent(getBaseContext(), MyActivity.class); i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(i); }Portaltoportal
This above comment's code really works well. At least you can move to first activity instead of complete exit from App. :)Abutting
P
6

You have probably spent many years writing "proper" programs for "proper" computers. You say you are learning to program in Android. This is just one of the things you have to learn. You can't spent years doing watercolour painting and assume that oil painting works exactly the same way. This was the very least of the things that were new concepts to me when I wrote my first app eight years ago.

Publicness answered 9/1, 2010 at 15:59 Comment(2)
Railing against the question isn't an answer to the question - it just wastes everyone's time. There may be reasons for needing an app to exit. Ones I've come across: 1) The user doesn't agree to the EULA. 2) The Play Store license check fails.Benedict
Having an app just disappear is very unprofessional. You just leave it up with a message telling the user what to do to fix the situation. Op was the one complaining. I was just saying you can't expect programming for one platform to be the same as every other platform. His use of emphasis, not mine. If you want to learn to program for mobile to have to learn to program for mobile.Publicness
D
6

Every time while you move to the next page through intent, use:

`YourActivityname.this.finish()`;

Example:

Intent intent = new Intent(getApplicationContext(), SMS.class);

startActivity(intent);
MainActivity.this.finish();

So that no activity will be running on background and when you want to Exit your app, use:

MainActivity.this.finish();
android.os.Process.killProcess(android.os.Process.myPid());
System.exit(0);
getParent().finish();

This exiting worked like a charm for me :)

Deaden answered 9/1, 2010 at 15:59 Comment(2)
It doesnt exit the app instead it comes to Mainactivity.Impressible
But be careful - onPause() IS NOT called in the case of killProcess and System.exit. We had some problems with that.Cottonmouth
I
6

It took me longer to read this Q&A than to actually implement a semi-proper Android Application Lifecycle.

It's a GPS app that polls for points and sends the current location to a webservice every few seconds using a thread... This could be polling every 5 minutes in Ted's case for an update, then onStop can simply start the update activity Ted was soo concerned about if one was found (asynchronous Ted, don't code like a Windows programmer or your programs will run like Windows programs ... eww, it's not that hard).

I did some initial code in onCreate to set up things for the activity lifetime, including checkUpdate.start();:

...

@Override
public void onStart() {
    super.onStart();
    isRemote = true;
    checkUpdate.resume();

    locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 2000, 0, luh);
}

@Override
public void onPause() {
    isRemote = false;
    checkUpdate.suspend();
    locationManager.removeUpdates(luh);
    super.onStop();
}

This code may be completely wrong, but it works. This is one of my first Android applications.

Voilà, an application that doesn't consume CPU when it's in the background, yet is instantly ready to reopen because it is in RAM (although not holding RAM as is the Android lifecycle) ... an app is always ready, it's a phone, guys/gals. If an app was to use up all the RAM and couldn't be shut down by the OS then the thing might stop ringing =P That's why the OS needs to be able to close your app when it's in the background (if your application isn't a resource hog it won't be closed BTW), so let's just write better applications.

Isomorph answered 9/1, 2010 at 15:59 Comment(2)
You shouldn't be calling super.onStop from onPause method.. This seems like it would screw things up majorly.Treenware
After reading through 20 or so philosophical answers that merely dodges the question.... +1 for having some code.Nucleotide
T
4

In any case, if you want to terminate your application you can always call System.exit(0);.

Teleplay answered 9/1, 2010 at 15:59 Comment(3)
System.exit() does NOT kill your app if you have more than one activity on the stack. An Android developer who uses it has not understood the basic Android app life-cycle. Read this answer.Parting
Full solution with System.exit(0); #2034414Alguire
Actually, System.exit() does kill your app. However, if the System.exit() was called from someplace other than the main activity, android will restart the app with one less activity on the stack. To me that seems like a ridiculous response to a clean intentional System.exit. I mean, if it was a div0 or some unintentional crash, maybe it would be polite to restart. But those don't even cause auto-re-launch as I recall. But in any case, the app is killed. It may be restarted, but that doesn't mean it was not killed.Colp
A
3

If you have 10,20 .. multiple Activities running and you want to finish all them and exit from system.

Create a static array in application class or constants class.

Constants

public class Constants {

public static ArrayList<Activity> activities = new ArrayList<Activity>();

}

MainActivity Add current activity reference in this array

activity = MainActivity.this; Constants.activities.add(activity);

public class MainActivity extends Activity {

    private ImageView imageButton;
    private Activity activity;


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        activity = MainActivity.this;
        Constants.activities.add(activity);

        imageButton = (ImageView) findViewById(R.id.camera);
        imageButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                // existing app.
                if (Constants.activities != null) {
                    for (int i = 0; i < Constants.activities.size(); i++) {
                        Activity s = Constants.activities.get(i);
                        s.finish();
                    }
                }
                //super.finish();
                finish();
                android.os.Process.killProcess(android.os.Process.myPid());
                System.exit(1);
            }
        });
    }
}
Alguire answered 9/1, 2010 at 15:59 Comment(1)
This can crash your app when the users tabs a button twice, especially when the system is under heavy load for any reason. This can be prevented by removing the activities from the array.Kauslick
P
2

Another Option can be Android Accessibility Services Which Greenify Application is using to Force close applications to speedup memory. With having your application accessibility service access you can click on buttons so basically Greenify Application clicks on the force close Button found in settings of an application:

Here you can study accessibility services: https://developer.android.com/reference/android/accessibilityservice/AccessibilityService.html

Here is the Setting Button which accessibility service clicks programitically: enter image description here

So You can Achieve Killing any Application Including Yours By the following Steps:

1) Register Application for Accessibility Services 2) Depending on your requirements if you want to kill all application get list of All Packages 3) Navigate to their Settings Screen And Click Force Close Button Thats It. I can Share a sample code I also created an application like greenify as an home assignment. Thank you

Update: "The user doesn't, the system handles this automatically." So Basically with this solution we are indirectly using system force close but on the User Demand. So That Both Stay Happy :-)

Plump answered 9/1, 2010 at 15:59 Comment(0)
I
2

For the first (starting ) activity of the application,

@Override
public void onBackPressed(){

    // Exit
    moveTaskToBack(true);
}

worked for me. I want to close the app here. And to come back from other activites; I used intents, e.g.

@Override
public void onBackPressed(){

    // Going back....
    Intent intent = new Intent(ActivityB.this, ActivityA.class);
    startActivity(intent);
    finish();
}

Note: This code is useful for the scenario where the developer wants to come back from ActivityZ to ActivityA and then close the app.

Introgression answered 9/1, 2010 at 15:59 Comment(0)
A
2

This is quite simple. Just follow these instruction which I am going to tell you:

Like you are having multiple activities, to go from one activity to another. You might be using the intent like this:

Intent i1 = new Intent(this, AnotherActivity);
startActivity(i1) 

You have just to add finish(); after starting the intent activity on each and every activity from start to end, for example,

Intent i1=new Intent(this, AnotherActivity);
startActivity(i1) 
finish();

So whenever you will click that exit button which is using finish() or System.exit(0) that must close your application completely.

Alphorn answered 9/1, 2010 at 15:59 Comment(1)
Why are you calling finish() right after startActivity(i1)? What is the goal here?Morganstein
D
1

As a novice Android developer, I am getting familiar with the life cycle, etc. As an Android user, I have always hated that I can't obliterate an app.

Why should any user trust an app? We may think putting an app in the background is "safe", but does the user? We may be in love with the genius of the "new" way of doing things, but not all apps are written perfectly or even well. Some may be nefarious and try to keep background processes running at all times. Some may be well-intentioned but messy.

I hate opening a browser or google and starting up at the last place I left off and having to back-stack dozens of slow pages just to feel like I get a clean start. The user should be in ultimate control. How many times does tech support tell us to "reboot our machine" or "close the program and restart"? Users need to feel they are rebooting an app, not restoring a state which possibly was frustrating them or causing them problems.

You can't expect people to retain a sophisticated model of an environment just to use an app to get something done. People feel in control of a pencil and paper because it is manifest in their experience of how it behaves and will behave in the future. Software is magic which all takes place behind the curtain. The rules for its behavior are as capricious as the developer that created it.

We should try to design appliances that relate to an underlying, almost physical, model that is robust and reliable and truly intuitive to the user. "Killing" an app is something a user can embrace. It's like throwing out a pile of scratch paper and starting over; closing a book and putting it back on the shelf. Magic has its place for dedicated professionals who can invest themselves in a particular world, such as video editing or animation systems. And these users often contribute to the features themselves and so are comfortable with them. But everyday users deserve at least a few really grounded options they can rely on regardless of sophistication level, in my opinion. I'm for an easy way to exit a process completely even if it is not the target model the system aspires to.

Delacroix answered 9/1, 2010 at 15:59 Comment(0)
S
1

You can use Process.killProcess(Process.myPid()); to kill your app, but maybe it is not safe? I didn't encounter any problem or crash after I used this method and after I used this, the process of my app in the DDMS list disappeared.

Sour answered 9/1, 2010 at 15:59 Comment(0)
S
1

Currently I implemented the following in my app. May these helps to move out from the application from whereever you want. I am calling this function from action bar Menus.

public static void exitApplication(Context context) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
        exitApplicationHC(context);
    }
    else {
        exitApplicationPreHC(context);
    }
}

private static void exitApplicationPreHC(Context context) {
    Intent i = new Intent(context, LoginActivity.class);
    i.putExtra(EXTRA_EXIT, true);
    i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    context.startActivity(i);
    if (context instanceof Activity) {
        ((Activity) context).finish();
    }
}

@TargetApi(Build.VERSION_CODES.HONEYCOMB)
private static void exitApplicationHC(Context context) {
    Intent i = new Intent(context, LoginActivity.class);
    i.putExtra(EXTRA_EXIT, true);
    i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
    context.startActivity(i);
}
Scenery answered 9/1, 2010 at 15:59 Comment(0)
S
1

Use this code:

Intent i = new Intent();
i.setAction(Intent.ACTION_MAIN);
i.addCategory(Intent.CATEGORY_HOME);
ListActivity.this.startActivity(i);
finish();
Sparoid answered 9/1, 2010 at 15:59 Comment(2)
Did you try that? And shouldn't a finish() in the activity that is called first be enough?Aircraft
I tried this but 3 threads were still left running even thought the activities closed. It may have appeared to work when running under the debugger, but in normal use, when I queried running processes from another app, it's still running.Sequacious
J
0

If you specify API >= 16, Activity#finishAffinity() meets your needs.

Junker answered 9/1, 2010 at 15:59 Comment(0)
B
-1

One of the important reasons to have the exit button is the "on exit" advertisment. On the exit, it is possible to display some revenue-generating ad. It is still somewhat annoying, like all ads are, but may be less annoying than something that keeps hanging around all time, using precious screen space. Some ad networks offer this way of advertisement. But, really, you cannot just put an exit button that does nothing after showing that ad!

As a result, one or another way to terminate the program is required in some cases, and "should never be needed" may not be the most comprehensive answer.

Activity.finish() or System.exit(0) could probably be used.

Broadfaced answered 9/1, 2010 at 15:59 Comment(2)
On exit advertisement is not the reason Android-exiting is so badly needed.Nucleotide
It would be very annoying if I quit an app and it stayed open showing adverts.Publicness

© 2022 - 2024 — McMap. All rights reserved.