【问题标题】:How to exit from the application and show the home screen?如何退出应用程序并显示主屏幕?
【发布时间】:2011-03-14 16:18:52
【问题描述】:

我有一个应用程序,在主页上有用于导航应用程序的按钮。

在该页面上,我有一个“退出”按钮,点击该按钮后,用户应该会转到应用程序图标所在的手机主屏幕。

我该怎么做?

【问题讨论】:

    标签: android exit back-button


    【解决方案1】:

    不建议退出您的 Android 应用程序。有关更多详细信息,请参阅此question

    用户始终可以通过主页按钮或在第一个活动中通过返回按钮退出您的应用。

    【讨论】:

    • @janusz:按下主页按钮永远不会退出android应用程序,而是进入后台......
    【解决方案2】:

    Android 的设计不支持选择退出应用程序,而是由操作系统管理它。你可以通过对应的 Intent 调出 Home 应用:

    Intent intent = new Intent(Intent.ACTION_MAIN);
    intent.addCategory(Intent.CATEGORY_HOME);
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    startActivity(intent);
    

    【讨论】:

    • 你甚至可以使用.. "moveTaskToBack(true);"
    • 它会释放所有资源吗?因为当我以这种方式退出应用程序时,一段时间后我再次单击应用程序图标。它从我离开它的地方开始。这意味着该应用仍在后台运行。
    • 这会将您的应用程序保持在后台,因此它不会退出应用程序。
    • 这个答案只会使主屏幕出现,并且不会按照 OP 的要求完全退出/关闭应用程序。
    • 这对你有帮助:moveTaskToBack(true); android.os.Process.killProcess(android.os.Process.myPid()); System.exit(1);
    【解决方案3】:

    如果您想结束一项活动,您只需致电finish()。 但是,在屏幕上设置退出按钮是一种不好的做法。

    【讨论】:

    • 我将它用于“您需要将此应用程序更新到最新版本”,我不希望他们继续使用它。还是不好的做法...?
    • @beetree 是的。像任何不良做法一样,在某些情况下,它是您唯一的选择,而您使用它是因为尝试做其他事情是荒谬的。它是 bad practice,与 illegal syntax 不同,它适用于少数情况,但您应该尽最大努力找到更好的方法它。在你的情况下,没有。
    【解决方案4】:

    当您调用该活动的完成 onDestroy() 时,将调用该活动并返回到活动堆栈中的上一个活动...所以..退出时不要调用完成();

    【讨论】:

      【解决方案5】:

      也许你可以试试这样的东西

      假设在我们的应用程序中,我们有许多活动(比如十个),我们需要直接退出这个活动。我们可以做的是,创建一个意图并转到根活动并将意图中的标志设置为

      intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
      

      另外,在意图中添加一些额外的布尔值

      intent.putExtra("EXIT", true);
      

      然后在根活动中,检查boolean 的值,并根据该调用完成(),在根活动的onCreate()

      if (getIntent().getBooleanExtra("EXIT", false)) {
       finish();
      }
      

      【讨论】:

      • 在 onCreate 中什么也不做来调用完成。
      • 就我而言,我也必须覆盖onNewIntent。因为 intnet.getExtras() 一直为空。
      • 并且此方法将重新启动您的RootActivity,而不是从堆栈中恢复它。在这里检查以克服这个stackoverflow.com/a/26258455/609782
      【解决方案6】:
      System.exit(0);
      

      可能是您正在寻找的。它将关闭整个应用程序并将您带到主屏幕。

      【讨论】:

      • 应该是小写退出吗?
      • 应该是 System.exit(0)。但无论如何它不是很有用。
      • System.exit(0) 不应按照核心 Android 团队的建议使用。
      • 我认为这是针对特殊情况的最佳方法。说一个需要互联网的应用程序,连接中断了应用程序中的一些活动。可以显示一个警告对话框(没有按钮)。 Back 按钮需要退出整个应用程序,因为重新进入需要再次登录/初始化。 System.exit 是我发现的唯一合理工作的东西。不过不确定@user1699548 的评论。
      • 这会杀死与该应用相关的所有服务吗?
      【解决方案7】:

      首先使用方法finish();完成您的应用程序

      然后在 onDestroy 中添加以下行以移除强制关闭

      android.os.Process.killProcess(android.os.Process.myPid());
      super.onDestroy();
      

      【讨论】:

      • 永远不要使用它,因为它没有机会释放资源
      • -1 因为 onDestroy 会在您离开活动时执行,而不仅仅是在按下返回键时。
      • @Jacky: 杀死进程如何不释放任何系统资源?
      • 为什么super.onDestroy()killProcess() 之后?这条线会到达吗?
      • 这不会也杀死你所有的服务吗?
      【解决方案8】:

      onDestroy() 中的finish(); 之后添加以下行:

      android.os.Process.killProcess(android.os.Process.myPid());
      super.onDestroy();
      

      【讨论】:

        【解决方案9】:

        我尝试使用以下代码 sn-p 退出应用程序,这对我有用。希望这对您有所帮助。 我做了 2 个活动的小演示 ​​

        第一个活动

        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;
                }
            }
        }
        

        您的任何其他活动

        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;
                }
            }
        }
        

        【讨论】:

          【解决方案10】:

          这对我很有效。
          关闭之前的所有活动如下:

              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

              setContentView(R.layout.main_layout);
          
              if( getIntent().getBooleanExtra("Exit me", false)){
                  finish();
                  return; // add this to prevent from doing unnecessary stuffs
              }
          

          【讨论】:

          • 这对我不起作用。它使我的应用程序没有任何可见的东西,但仍在运行一些方法。我可以看到在调试器中徘徊并等待的线程实际上永远不会做任何事情。
          【解决方案11】:

          我用观察者模式做到了。

          观察者界面

          public interface Observer {
          public void update(Subject subject);
          }
          

          基础主题

          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);
              }
          }
          }
          

          子 Subject 实现了退出方法

          public class ApplicationSubject extends Subject {
          public void exit(){
              notifyObservers();
          }
          }
          

          您的应用程序应该扩展它的 MyApplication

          public class MyApplication extends Application {
          
          private static ApplicationSubject applicationSubject;
          
          public ApplicationSubject getApplicationSubject() {
                      if(applicationSubject == null) applicationSubject = new ApplicationSubject();
              return applicationSubject;
          }
          

          }

          基础活动

          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();
          }
          
          }
          

          让我们测试一下

          public class ATestActivity extends BaseActivity {
          @Override
          protected void onCreate(Bundle savedInstanceState) {
              // TODO Auto-generated method stub
              super.onCreate(savedInstanceState);
              close(); //invoke 'close'
          }
          }
          

          【讨论】:

            【解决方案12】:

            (我尝试了以前的答案,但它们在某些方面缺乏。例如,如果您在完成活动后不执行return;,则剩余的活动代码将运行。您还需要编辑 onCreate 并返回。如果您不这样做运行 super.onCreate() 你会得到一个运行时错误)

            假设你有MainActivityChildActivity

            在 ChildActivity 里面添加这个:

            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 里面添加这个:

            @Override
            public void onCreate(Bundle savedInstanceState) {
            
                mContext = getApplicationContext();
            
                super.onCreate(savedInstanceState);
            
                if (getIntent().getBooleanExtra("EXIT", false)) {
                    finish();
                    return;
                }
                // your current codes
                // your current codes
            }
            

            【讨论】:

              【解决方案13】:

              某些活动实际上您不想在按下后退按钮时再次打开,例如启动屏幕活动、欢迎屏幕活动、确认窗口。实际上,您在活动堆栈中不需要这个。你可以使用=> 打开 manifest.xml 文件并添加一个属性来做到这一点

              android:noHistory="true"

              这些活动。

              <activity
                  android:name="com.example.shoppingapp.AddNewItems"
                  android:label="" 
                  android:noHistory="true">
              </activity>
              

              有时您想在按下某个后退按钮时关闭整个应用程序。这里的最佳做法是打开主窗口而不是退出应用程序。为此,您需要覆盖 onBackPressed() 方法。通常这个方法会打开栈顶的activity。

              @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() 方法。它不会关闭整个应用程序。它将用于堆栈中的上一个活动。

              @Override
              public void onBackPressed() {
                finish();
              }
              

              【讨论】:

                【解决方案14】:

                如果您想退出您的应用程序。然后在您的按钮按下事件中使用此代码。 喜欢:

                public void onBackPressed()
                {
                    moveTaskToBack(true);
                    android.os.Process.killProcess(android.os.Process.myPid());
                    System.exit(1);
                }
                

                【讨论】:

                  【解决方案15】:

                  还有另一种选择,使用 FinishAffinity 方法关闭堆栈中与应用程序相关的所有任务。

                  见: https://stackoverflow.com/a/27765687/1984636

                  【讨论】:

                    【解决方案16】:

                    这就是我所做的:

                    SomeActivity.java

                     @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

                    @Override
                    protected void onCreate(Bundle savedInstanceState) {
                          super.onCreate(savedInstanceState);
                          finish();
                    }
                    

                    基本上你所做的是从堆栈中清除所有活动并启动QuitAppActivity,这将完成任务。

                    【讨论】:

                    • 好方法。无需通过 Intent 传递值。
                    【解决方案17】:

                    如果你想退出应用程序 将此代码放在您的函数下

                    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);
                    }
                    

                    【讨论】:

                      【解决方案18】:

                      100% 工作正常。这是退出您的应用程序 onClick(方法)的代码

                          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();
                      
                              }
                          });
                      

                      【讨论】:

                        【解决方案19】:

                        您可以在退出按钮的onClickedListener 中添加moveTaskToBack(true) 以最小化应用程序。

                        希望对你有帮助。

                        【讨论】:

                          【解决方案20】:

                          也许我的代码可以帮助(Main_Activity.java):

                              @Override
                              protected void onDestroy() {
                                  super.onDestroy();
                                  this.finish();
                                  exit(0);
                              }
                          
                              @Override
                              public boolean onKeyDown(int keyCode, KeyEvent event)  {
                                  switch(keyCode)    {
                                      case KeyEvent.KEYCODE_BACK:
                                          AlertDialog.Builder builder = new AlertDialog.Builder(this);
                                          builder.setTitle("My application").setMessage("Keep playing?").setIcon(R.drawable.icon);
                                          // Go to backgroung
                                          builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
                                              public void onClick(DialogInterface dialog, int which) { moveTaskToBack(true); }
                                          });
                                          // Exit from app calling protected void onDestroy()
                                          builder.setNegativeButton("CLOSE APPLICATION", new DialogInterface.OnClickListener() {
                                              public void onClick(DialogInterface dialog, int which) { onDestroy(); }
                                          });
                                          // Close this dialog
                                          builder.setNeutralButton("CANCEL", new DialogInterface.OnClickListener() {
                                              public void onClick(DialogInterface dialog, int which) { dialog.cancel(); }
                                          });
                                          AlertDialog dialog = builder.create();
                                          dialog.show();
                                          return true;
                                  }
                                  return false;
                              }
                          

                          【讨论】:

                            【解决方案21】:

                            这是最简单的一个

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

                            这将关闭应用程序,并且不会破坏方法服务,此任务将完成。

                            【讨论】:

                              【解决方案22】:

                              您可以使用finish(); moveTaskToBack(true);System.exit(1); 退出您的应用程序。

                              public void onBackPressed() {
                                  AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this);
                                  alertDialogBuilder.setTitle("Exit Application?");
                                  alertDialogBuilder
                                          .setMessage("Click yes to exit!")
                                          .setCancelable(false)
                                          .setPositiveButton("Yes",
                                                  new DialogInterface.OnClickListener() {
                                                      public void onClick(DialogInterface dialog, int id) {
                                                          finish();
                                                          moveTaskToBack(true);
                                                          android.os.Process.killProcess(android.os.Process.myPid());
                                                          System.exit(1);
                                                      }
                                                  })
                              
                                          .setNegativeButton("No", new DialogInterface.OnClickListener() {
                                              public void onClick(DialogInterface dialog, int id) {
                              
                                                  dialog.cancel();
                                              }
                                          });
                              
                                  AlertDialog alertDialog = alertDialogBuilder.create();
                                  alertDialog.show();
                              }
                              

                              【讨论】:

                                猜你喜欢
                                • 2018-01-23
                                • 1970-01-01
                                • 1970-01-01
                                • 1970-01-01
                                • 1970-01-01
                                • 2014-12-18
                                • 2019-10-19
                                • 1970-01-01
                                • 1970-01-01
                                相关资源
                                最近更新 更多