在Android上关闭应用程序并启动主屏幕

在Android上关闭应用程序并启动主屏幕,android,android-activity,Android,Android Activity,我有两种不同的活动。第一个启动第二个。在第二个活动中,我调用System.exit(0),以强制关闭应用程序,但第一个活动将自动显示,而不是应用程序返回主屏幕。如何避免这种情况,并使应用程序返回主屏幕?启动第二个活动时,finish()立即启动第一个活动: startActivity(new Intent(...)); finish(); 您还可以在第一个活动的标记中指定=“true”,或者在启动第二个活动后立即完成第一个活动(如David所说) AFAIK,“强制关闭”会终止承载应用程序运行

我有两种不同的活动。第一个启动第二个。在第二个活动中,我调用
System.exit(0)
,以强制关闭应用程序,但第一个活动将自动显示,而不是应用程序返回主屏幕。如何避免这种情况,并使应用程序返回主屏幕?

启动第二个活动时,
finish()
立即启动第一个活动:

startActivity(new Intent(...));
finish();
您还可以在第一个活动的标记中指定=“true”,或者在启动第二个活动后立即完成第一个活动(如David所说)

AFAIK,“强制关闭”会终止承载应用程序运行和运行的JVM的进程 exit()终止运行应用程序实例的JVM。两者都是突然终止的形式,不建议用于正常应用程序流

正如捕获异常以覆盖程序可能执行的逻辑流一样,这是不可取的。

您不能执行System.exit(),这是不安全的

你可以这样做:
Process.killProcess(Process.myPid())

简短回答:调用而不是
System.exit()
。这将隐藏您的应用程序,直到用户想要再次使用它

较长的答案从另一个问题开始:为什么要终止应用程序

Android操作系统处理内存管理和进程等,所以我的建议是让Android为你担心。如果用户想要离开你的应用程序,他们可以按下Home按钮,你的应用程序就会消失。如果以后手机需要更多内存,操作系统将终止您的应用程序

只要您是,您和用户都不需要关心您的应用程序是否仍在运行


因此,如果您想隐藏应用程序,请调用moveTaskToBack(),并让Android决定何时终止它。

您真的应该考虑不退出应用程序。Android应用程序通常不是这样工作的。

Android.os.Process.killProcess(Android.os.Process.myPid())
工作正常,但建议让Android平台担心内存管理:-)

使用
finish
方法。这是一种简单易行的方法

this.finish();

请记住,在使用持久套接字连接的应用程序时,
finish()
方法不会释放连接。在正常情况下,
finish()
是最好的选择,但如果您确实需要退出应用程序并释放它使用的所有资源,请使用
killProcess
。我在使用它时没有遇到任何问题。

下面给出了实现这一点的最简单方法(不影响Android的本机内存管理。不涉及进程杀戮)

  • 使用以下意图启动活动:

    Intent intent = new Intent(this, FinActivity.class);
    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    startActivity(intent);
    finish();
    
  • 在目标活动
    FinActivity.class
    中,在
    onCreate
    中调用finish()

  • 步骤说明:

  • 您创建了一个删除所有其他活动
    (标记\u活动\u清除\u顶部)
    并删除当前活动的意图

  • 这种活动会自我毁灭。另一种选择是,你可以在finActivity中制作一个闪屏。这是可选的


  • Android有一种机制,可以根据文档安全地关闭应用程序。在退出的最后一个活动(通常是应用程序启动时第一次出现的主活动)中,只需在onDestroy()方法中放置几行即可。调用System.runFinalizersOnExit(true)可确保在应用程序退出时,所有对象都将被终结并被垃圾回收。例如:

    public void onDestroy() {
        super.onDestroy();
    
        /*
         * Notify the system to finalize and collect all objects of the
         * application on exit so that the process running the application can
         * be killed by the system without causing issues. NOTE: If this is set
         * to true then the process will not be killed until all of its threads
         * have closed.
         */
        System.runFinalizersOnExit(true);
    
        /*
         * Force the system to close the application down completely instead of
         * retaining it in the background. The process that runs the application
         * will be killed. The application will be completely created as a new
         * application in a new process if the user starts the application
         * again.
         */
        System.exit(0);
    }
    

    最后,Android不会通知应用程序HOME键事件,因此当按下HOME键时,您无法关闭应用程序。Android将HOME键事件保留给自己,这样开发者就不能阻止用户离开他们的应用程序。

    使用startActivityForResult启动第二个活动,并在第二个活动中返回一个值,该值在第一个活动的onActivityResult方法中关闭主应用程序。我认为这是Android的正确做法。

    我使用此方法来关闭活动

    public static void closeAllBelowActivities(Activity current) {
        boolean flag = true;
        Activity below = current.getParent();
        if (below == null)
            return;
        System.out.println("Below Parent: " + below.getClass());
        while (flag) {
            Activity temp = below;
            try {
                below = temp.getParent();
                temp.finish();
            } catch (Exception e) {
                flag = false;
            }
        }
    }
    

    尝试以下方法。它对我有用

    ActivityManager am = (ActivityManager) this.getSystemService(ACTIVITY_SERVICE);
    List<ActivityManager.RunningTaskInfo> taskInfo = am.getRunningTasks(1); 
    ComponentName componentInfo = taskInfo.get(0).topActivity;
    am.restartPackage(componentInfo.getPackageName());
    
    ActivityManager am=(ActivityManager)this.getSystemService(ACTIVITY_服务);
    List taskInfo=am.getRunningTasks(1);
    ComponentName componentInfo=taskInfo.get(0).topActivity;
    restartPackage(componentInfo.getPackageName());
    
    这其实很简单

    我这样做的方法是将一个标志保存在一个对所有人都可用的静态变量中。然后,当我退出时,我设置了这个标志,我的所有活动都会检查这个标志
    onResume
    。如果设置了该标志,则我对该活动发出
    系统退出


    这样,所有活动都将检查标志,并在设置标志时正常关闭。

    使用“开始活动”运行第二个活动以获得结果:

    Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
    
    //This line is important
    intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
    
    startActivityForResult(intent, REQUEST_CODE);
    
    将此函数添加到第一个活动:

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if(rquestCode == REQUEST_CODE)
            if(resultCode == RESULT_CANCELED)
                finish();
    }
    
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event)  {
        if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {
    
            Log.i(TAG, "Back key pressed");
            setResult(RESULT_CANCELED);
            finish();
            return true;
        }
        return super.onKeyDown(keyCode, event);
    }
    
    并将此添加到第二个活动中:

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if(rquestCode == REQUEST_CODE)
            if(resultCode == RESULT_CANCELED)
                finish();
    }
    
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event)  {
        if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {
    
            Log.i(TAG, "Back key pressed");
            setResult(RESULT_CANCELED);
            finish();
            return true;
        }
        return super.onKeyDown(keyCode, event);
    }
    

    你错了。有一种方法可以终止应用程序。在具有超级类应用程序的类中,我们使用一些字段,例如,
    killApp
    。当我们在
    onResume()
    中启动启动屏幕(第一个活动)时,我们为字段
    killApp
    设置了一个参数false。当最后调用
    onResume()
    时,我们的每一个活动都会这样调用:

    if(AppClass.killApp())
        finish();
    
    进入屏幕的每个活动都必须调用
    onResume()
    。调用时,我们必须检查字段
    killApp
    是否为真。如果为true,则当前活动调用
    finish()
    。为了调用完整操作,我们使用下一个构造。例如,在按钮的操作中:

    AppClass.setkillApplication(true);
       finish();
       return;
    
    我用这个:

    1) 父活动调用
    public static boolean isQuit = false;
    
    mainactivity.isQuit = true;
    finish();
    
    @Override
    protected void onRestart() {
        // TODO Auto-generated method stub
        super.onRestart();
        if(mainactivity.isQuit)
            finish();
    }
    
    protected void onResume() {
        super.onResume();
        if(BaseActivity.shutDownApp)
        {
            finish();
            return;
    
        }}
    
    Intent intent = new Intent(D.this,A.class);
    intent.putExtra("exit", "exit");
    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP| Intent.FLAG_ACTIVITY_SINGLE_TOP);
    startActivity(intent);
    
    @Override
        protected void onNewIntent(Intent intent) {
            super.onNewIntent(intent);
            if (intent.hasExtra("exit")) {
                setIntent(intent);
            }
        }
    
        @Override
        protected void onResume() {
            super.onResume();
            if (getIntent() != null) {
                if (("exit").equalsIgnoreCase(getIntent().getStringExtra(("exit")))) {
                    onBackPressed();
                }
            }
        }
    
    public class MainActivity extends AppCompatActivity {
        private static final String TAG = "sm500_Rmt.MainActivity";
        private boolean m_IsBrowserStarted = false;
    
        @Override
    protected void onResume() {
        super.onResume();
        if(m_IsBrowserStarted) {
            Log.w(TAG, "onResume, but it's return from browser, just exit!");
            finish();
            return;
        }
        Log.w(TAG, "onResume");
    
        Intent intent = new Intent(this, BrowserActivity.class);
        intent.putExtra(getString(R.string.IPAddr), ip);
        startActivity(intent);
        m_IsBrowserStarted = true;