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

Aru*_*tha 75 android android-activity

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

Dav*_*ebb 88

简短的回答:打电话moveTaskToBack(true)给你Activity而不是System.exit().这将隐藏您的应用程序,直到用户想要再次使用它.

更长的答案从另一个问题开始:你为什么要杀死你的申请?

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

只要您正确地响应生命周期事件,您和用户都不需要关心您的应用程序是否仍在运行.

因此,如果你想隐藏你的应用程序调用moveTaskToBack(),让Android决定何时杀死它.

  • 有关Dave论点的更多信息,请查看http://stackoverflow.com/questions/2033914/quitting-an-application-is-that-frowned-upon/2034238#2034238 (4认同)
  • @Matt:你为什么不在密码屏幕上停止用户?如果他们无法超越这一点,那么为什么你需要强制关闭应用? (4认同)

小智 53

下面给出了实现此目的的最简单方法(不影响Android的本机内存管理.不涉及进程终止).

  1. 使用此Intent启动活动:

    Intent intent = new Intent(this, FinActivity.class);
    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    startActivity(intent);
    finish();
    
    Run Code Online (Sandbox Code Playgroud)
  2. 在目标活动中FinActivity.class,调用finish()onCreate.

步骤说明:

  1. 您创建一个删除所有其他活动(FLAG_ACTIVITY_CLEAR_TOP)并删除当前活动的intent .

  2. 活动摧毁了自己.另一种方法是,您可以在finActivity中制作闪屏.这是可选的.

  • 你不想在finish()之前使用startActivity()吗? (3认同)

Rom*_*Guy 45

你应该考虑不退出应用程序.这不是Android应用程序通常的工作方式.

  • 由于Android应用程序中没有退出.有没有办法可以遍历应用程序的所有活动,以便我在每个上调用Finish()即完成所有已启动的活动? (2认同)
  • 你为什么需要这样做?由于您已经退出或其他一些条件,活动是否处于不正确的状态?你可以在`onResume`中检查这个,然后`完成'活动. (2认同)
  • 作为用户和开发人员的问题是,Android中的自动内存清理工作效果不佳.有很多"行为不端"的应用程序,我的手机确实开始耗尽内存,当它变低时,UI开始口吃.这是一个相对较高的规格(目前)HTC Desire.我想这就是我和其他人有时会问这个问题的原因. (2认同)
  • @pydave:我同意你的看法.但是在这类话题上似乎存在很多争论,我正在分享一些"真实世界"的开发和用户体验.事实上,当可用内存减少时,我的手机会明显减慢速度.似乎我有"在后台"的应用程序,可以这么说,它正在消耗那些记忆.如果我杀了这些应用程序,我有经验,我的设备加速.这让我觉得如果1)开发人员可以编写代码来完全杀死进程并释放其内存,或者2)android GC比现在运行得更好,这将是很好的.因人而异 (2认同)

Dan*_*OMS 20

Android有一个机制来根据其文档安全地关闭应用程序.在退出的最后一个Activity(通常是应用程序启动时首次出现的主Activity)中,只需在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);
}
Run Code Online (Sandbox Code Playgroud)

最后,Android不会通知HOME键事件的应用程序,因此在按下HOME键时无法关闭应用程序.Android会将HOME键事件保留 给自己,以便开发人员无法阻止用户离开其应用程序.

  • 查看AOSP源代码,现在不推荐使用此方法:@deprecated此方法不安全. (4认同)

Sam*_*muh 9

您还可以在第一个活动的标签中指定noHistory ="true",或者在启动第二个活动后立即完成第一个活动(如David所说).

AFAIK,"强制关闭"会终止承载运行应用程序的JVM的进程,System.exit()终止运行应用程序实例的JVM.两者都是突然终止的形式,不适用于正常的应用程序流程.

就像捕获异常以涵盖程序可能采用的逻辑流程一样,这是不可取的.

  • 不,Android中没有真正的"应用程序"概念; 您的应用是一系列活动.如果你不希望在完成第二个活动后回到第一个活动,那么你应该使用上面提到的`noHistory`属性. (2认同)

ams*_*ana 9

我用这个方法关闭活动!

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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


Dav*_*und 8

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

startActivity(new Intent(...));
finish();
Run Code Online (Sandbox Code Playgroud)


Arn*_*nab 6

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