How to exit from the application and show the home screen?
我有一个应用程序,在主页上我有通过应用程序导航的按钮。
在那个页面上,我有一个"EXIT"按钮,当点击它时,应该将用户带到应用程序图标所在的手机上的主屏幕。
我怎样才能做到这一点?
Android的设计不赞成通过选择退出应用程序,而是通过操作系统管理它。您可以通过相应的Intent调出Home应用程序:
1 2 3 4 | Intent intent = new Intent(Intent.ACTION_MAIN); intent.addCategory(Intent.CATEGORY_HOME); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent); |
也许你可以尝试这样的事情
假设在我们的应用程序中,我们有许多活动(比如十个),我们需要直接退出此活动。我们可以做的是,创建一个intent并转到root活动并在intent中设置标志
1 | intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); |
另外,在意图中添加一些额外的布尔值
1 | intent.putExtra("EXIT", true); |
然后在root活动中,检查
1 2 3 | if (getIntent().getBooleanExtra("EXIT", false)) { finish(); } |
1 | System.exit(0); |
可能就是你要找的东西。它将关闭整个应用程序并带您进入主屏幕。
这对我很有用。
关闭所有以前的活动,如下所示:
1 2 3 4 5 | Intent intent = new Intent(this, MainActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); intent.putExtra("Exit me", true); startActivity(intent); finish(); |
然后在MainActivity onCreate()方法中添加此项以完成MainActivity
1 2 3 4 5 6 | setContentView(R.layout.main_layout); if( getIntent().getBooleanExtra("Exit me", false)){ finish(); return; // add this to prevent from doing unnecessary stuffs } |
首先使用方法
然后在onDestroy中添加以下行以删除Force关闭
1 2 | android.os.Process.killProcess(android.os.Process.myPid()); super.onDestroy(); |
如果要结束活动,只需调用
然而,在屏幕上有一个退出按钮是不好的做法。
有些活动实际上你不想在按下后退按钮时再次打开这样的Splash Screen Activity,欢迎屏幕活动,确认Windows。实际上你在活动堆栈中不需要这个。你可以使用=> open manifest.xml文件并添加一个属性
android:noHistory="true"
这些活动。
1 2 3 4 5 | <activity android:name="com.example.shoppingapp.AddNewItems" android:label="" android:noHistory="true"> </activity> |
要么
有时您希望在某些后退按钮中关闭整个应用程序。这里的最佳实践是打开主窗口而不是退出应用程序。为此,您需要覆盖onBackPressed()方法。通常这种方法会打开堆栈中的顶级活动。
1 2 3 4 5 6 7 8 | @Override public void onBackPressed(){ Intent a = new Intent(Intent.ACTION_MAIN); a.addCategory(Intent.CATEGORY_HOME); a.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(a); } |
要么
在按下后退按钮时,您希望退出该活动,并且您也不想在活动堆栈中添加此活动。在onBackPressed()方法中调用finish()方法。它不会关闭整个应用程序。它将用于堆栈中的先前活动。
1 2 3 4 | @Override public void onBackPressed() { finish(); } |
建议不要退出Android应用程序。有关详细信息,请参阅此问题。
用户可以随时通过主页按钮退出应用程序,也可以通过后退按钮退出第一个活动。
(我尝试过以前的答案,但他们缺少一些观点。例如,如果你在完成活动后没有做
假设你有
在ChildActivity里面添加:
1 2 3 4 5 | Intent intent = new Intent(ChildActivity.this, MainActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); intent.putExtra("EXIT", true); startActivity(intent); return true; |
在MainActivity的onCreate里面添加:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | @Override public void onCreate(Bundle savedInstanceState) { mContext = getApplicationContext(); super.onCreate(savedInstanceState); if (getIntent().getBooleanExtra("EXIT", false)) { finish(); return; } // your current codes // your current codes } |
还有另一种选择,使用FinishAffinity方法关闭与应用程序相关的堆栈中的所有任务。
看到:
https://stackoverflow.com/a/27765687/1984636
这是我做的:
SomeActivity.java
1 2 3 4 5 6 7 | @Override public void onBackPressed() { Intent newIntent = new Intent(this,QuitAppActivity.class); newIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(newIntent); finish(); } |
QuitAppActivity.java
1 2 3 4 5 | @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); finish(); } |
基本上你所做的是清除堆栈中的所有活动并启动
当你调用完成后,该活动的onDestroy()将被调用,它将返回活动堆栈中的前一个活动...所以..退出时不要调用finish();
我尝试使用以下代码片段退出应用程序,这对我有用。希望这对你有所帮助。
我做了2个活动的小型演示
第一次活动
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | public class MainActivity extends Activity implements OnClickListener{ private Button secondActivityBtn; private SharedPreferences pref; private SharedPreferences.Editor editer; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); secondActivityBtn=(Button) findViewById(R.id.SecondActivityBtn); secondActivityBtn.setOnClickListener(this); pref = this.getSharedPreferences("MyPrefsFile", MODE_PRIVATE); editer = pref.edit(); if(pref.getInt("exitApp", 0) == 1){ editer.putInt("exitApp", 0); editer.commit(); finish(); } } @Override public void onClick(View v) { switch (v.getId()) { case R.id.SecondActivityBtn: Intent intent= new Intent(MainActivity.this, YourAnyActivity.class); startActivity(intent); break; default: break; } } } |
你的任何其他活动
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | public class YourAnyActivity extends Activity implements OnClickListener { private Button exitAppBtn; private SharedPreferences pref; private SharedPreferences.Editor editer; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_any); exitAppBtn = (Button) findViewById(R.id.exitAppBtn); exitAppBtn.setOnClickListener(this); pref = this.getSharedPreferences("MyPrefsFile", MODE_PRIVATE); editer = pref.edit(); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.exitAppBtn: Intent main_intent = new Intent(YourAnyActivity.this, MainActivity.class); main_intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(main_intent); editer.putInt("exitApp",1); editer.commit(); break; default: break; } } } |
100%工作正常。 这是退出你的应用程序的代码onClick(方法)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | Button exit = (Button)findViewById(R.id.exitbutton); exit.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { finish(); android.os.Process.killProcess(android.os.Process.myPid()); System.exit(1); Toast.makeText(getApplicationContext(),"Closed Completely and Safely", Toast.LENGTH_LONG).show(); } }); |
我用观察者模式做到了。
观察者界面
1 2 3 | public interface Observer { public void update(Subject subject); } |
基础科目
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | public class Subject { private List<Observer> observers = new ArrayList<Observer>(); public void attach(Observer observer){ observers.add(observer); } public void detach(Observer observer){ observers.remove(observer); } protected void notifyObservers(){ for(Observer observer : observers){ observer.update(this); } } } |
子主题实现退出方法
1 2 3 4 5 | public class ApplicationSubject extends Subject { public void exit(){ notifyObservers(); } } |
您的应用程序应该扩展它的MyApplication
1 2 3 4 5 6 7 8 | public class MyApplication extends Application { private static ApplicationSubject applicationSubject; public ApplicationSubject getApplicationSubject() { if(applicationSubject == null) applicationSubject = new ApplicationSubject(); return applicationSubject; } |
}
基础活动
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | public abstract class BaseActivity extends Activity implements Observer { public MyApplication app; @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); app = (MyApplication) this.getApplication(); app.getApplicationSubject().attach(this); } @Override public void finish() { // TODO Auto-generated method stub app.getApplicationSubject().detach(this); super.finish(); } /** * exit the app */ public void close() { app.getApplicationSubject().exit(); }; @Override public void update(Subject subject) { // TODO Auto-generated method stub this.finish(); } } |
我们来试试吧
1 2 3 4 5 6 7 8 | public class ATestActivity extends BaseActivity { @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); close(); //invoke 'close' } } |
如果你想退出申请
将此代码放在您的函数下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | public void yourFunction() { finishAffinity(); moveTaskToBack(true); } //For an instance, if you want to exit an application on double click of a //button,then the following code can be used. @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 2) { // do something on back. From Android 16+ you can use the following: finishAffinity(); moveTaskToBack(true); } return super.onKeyDown(keyCode, event); } |
在
1 2 | android.os.Process.killProcess(android.os.Process.myPid()); super.onDestroy(); |
如果要退出应用程序。然后在按下按钮的事件中使用此代码。
喜欢:
1 2 3 4 5 6 | public void onBackPressed() { moveTaskToBack(true); android.os.Process.killProcess(android.os.Process.myPid()); System.exit(1); } |