java - Android - System.exit(0) 并重新启动活动和服务
问题描述
我正在制作一个 Android 应用程序,我需要立即完全重启该应用程序。所以,要做到这一点,唯一有效的解决方案(我记得)是使用 System.exit(0)。我不知道为什么我有这段代码(我不记得我为什么尝试它或我在哪里看到它或者这只是一个意外),但我知道它正在工作,现在我正在审查代码以将此应用于服务,它没有启动我想要的活动(一个将完全停止应用程序并从零重新启动服务的活动 - 或者一个会做同样事情的服务,但没有调用该服务,也没有活动,所以我不知道它是否通过调用服务来工作 - 我知道它工作的活动,至少来自另一个活动):
- MainActivity.java (我想重新启动它)
Intent MainRestarter= new Intent();
MainRestarter.setClass(MainActivity.this, MainRestarter.class);
MainRestarter.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
MainRestarter.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
startActivity(MainRestarter);
System.exit(0);
- MainRestarter.java
Intent MainActivity = new Intent();
MainActivity.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
MainActivity.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
MainActivity.setClass(MainRestarter.this, MainActivity.class);
startActivity(MainActivity);
finish();
但我测试过,它也适用于:
- MainActivity.java (我想重新启动它)
Intent MainActivity = new Intent();
MainActivity.setClass(MainActivity.this, MainActivity.class);
MainActivity.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
MainActivity.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
startActivity(MainActivity);
System.exit(0);
从另一个线程的答案(finish() 和 System.exit(0) 之间的区别):
“System.exit(0) - 重新启动应用程序,在堆栈上少一个活动。因此,如果您从 ActivityA 调用 ActivityB,并且在 ActivityB 中调用 System.exit(0),那么应用程序将被终止并立即启动只有一个活动 ActivityA” - 这里的区别是(使用那里的名称)我从 ActivityA 调用 ActivityB,然后在 ActivityA 上调用 System.exit(0),然后它使用 ActivityB 重新启动。但这不适用于服务,不知道为什么......
我认为这应该只是停止整个应用程序,但在阅读了那个答案后,我感到很困惑。顺便说一句,它只有在我调用 startActivity() 时才有效,否则应用程序将完全关闭。谁能解释我为什么这段代码有效,然后解释为什么我在服务中尝试完全相同的代码时它不起作用?
提前致谢!
编辑:我知道我可以在 System.exit(0) 之前调用 AlarmManager,但我只想知道为什么会这样,以及我是否可以继续使用它而不是 AlarmManager(在 MainActivity 上,因为在服务上,由于某种原因,上述方法不起作用,如果有人知道,我也想知道为什么),因为我读到它会消耗更多电池。
解决方案
推荐阅读
- graphql - 通过 GraphQL 查询多对多相关数据
- php - php如何在不使用foreach的情况下单独回显数组数据
- c# - EventGridClient:它应该被处置吗?
- php - 如何访问和求和数组数组中的值
- c# - 在 img src 中定义带有链接的变量 - c#
- android - java.lang.VerifyError:从 4.0.1 升级到 4.1.1 后 Android 4 中的 f/i/b/f
- objective-c - 如何使用 DJI SDK 收听遥控器棒值更新?
- function - 引用 Scheme 中的列表时出错,使用 `define` 函数命名
- c# - System.ArgumentNullException:值不能为 null ,参数名称:queryString
- html - 关键字/标签与整个 HTML 文件中的整行代码之间的某种引用