可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
Possible Duplicate:
Quitting an application - is that frowned upon?
I want to offer the user an option to exit the application as I need to delete some sensitive data, which is stored in the SharedPreferences as long as the application needs it.
As soon as the user wants to exit, the password in the SharedPreferences should be wiped and of course all activities of the application should be closed (it makes no sense to run them without the known password - they would crash).
How can I do that?
System.exit(0)
and finish()
only exit the current activity - useless. I know there is a taskmanager app. How is that one doing it? It\'s able to kill the whole application...
回答1:
When you use the finish() method, it does not close the process completely , it is STILL working in background.
Please use this code in Main Activity (Please don\'t use in every activities or sub Activities):
@Override
public void onBackPressed() {
android.os.Process.killProcess(android.os.Process.myPid());
// This above line close correctly
}
回答2:
You are correct: calling finish()
will only exit the current activity, not the entire application. however, there is a workaround for this:
Every time you start an Activity, start it using startActivityForResult(...)
. When you want to close the entire app, you can do something like this:
setResult(RESULT_CLOSE_ALL);
finish();
Then define every activity\'s onActivityResult(...)
callback so when an activity returns with the RESULT_CLOSE_ALL
value, it also calls finish()
:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch(resultCode)
{
case RESULT_CLOSE_ALL:
setResult(RESULT_CLOSE_ALL);
finish();
}
super.onActivityResult(requestCode, resultCode, data);
}
This will cause a cascade effect closing all activities.
Also, I support CommonsWare in his suggestion: store the password in a variable so that it will be destroyed when the application is closed.
回答3:
When the user wishes to exit all open activities, they should press a button which loads the first Activity that runs when your app starts, in my case \"LoginActivity\".
Intent intent = new Intent(getApplicationContext(), LoginActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.putExtra(\"EXIT\", true);
startActivity(intent);
The above code clears all the activities except for LoginActivity. LoginActivity is the first activity that is brought up when the user runs the program. Then put this code inside the LoginActivity\'s onCreate, to signal when it should self destruct when the \'Exit\' message is passed.
if (getIntent().getBooleanExtra(\"EXIT\", false)) {
finish();
}
The answer you get to this question from the Android platform is: \"Don\'t make an exit button. Finish activities the user no longer wants, and the Activity manager will clean them up as it sees fit.\"
回答4:
which is stored in the
SharesPreferences as long as the
application needs it.
Why?
As soon as the user wants to exit, the
password in the SharedPreferences
should be wiped and of course all
activities of the application should
be closed (it makes no sense to run
them without the known password - they
would crash).
Even better: don\'t put the password in SharedPreferences
. Hold onto it in a static data member. The data will naturally go away when all activities in the app are exited (e.g., BACK button) or otherwise destroyed (e.g., kicked out of RAM to make room for other activities sometime after the user pressed HOME).
If you want some sort of proactive \"flush password\", just set the static data member to null
, and have your activities check that member and take appropriate action when it is null
.
回答5:
Using onBackPressed()
method:
@Override
public void onBackPressed() {
android.os.Process.killProcess(android.os.Process.myPid());
}
or use the finish()
method, I have something like
//Password Error, I call function
Quit();
protected void Quit() {
super.finish();
}
With super.finish() you close the super class\'s activity.
回答6:
My understanding of the Android application framework is that this is specifically not permitted. An application is closed automatically when it contains no more current activities. Trying to create a \"kill\" button is apparently contrary to the intended design of the application system.
To get the sort of effect you want, you could initiate your various activities with startActivityForResult(), and have the exit button send back a result which tells the parent activity to finish(). That activity could then send the same result as part of its onDestroy(), which would cascade back to the main activity and result in no running activities, which should cause the app to close.