安卓手机如何关机(需要root权限)

7

我正在为root用户开发的安卓应用程序中,执行了一个关机操作:

su reboot -p

它运行得很好,但我注意到手机几乎立即关闭(与显示关闭动画并可能执行其他操作相反)。

这是以编程方式关闭安卓手机的正确方法吗?在关机之前是否有需要执行的一些关键代码?


@unforgettableid,您提出的编辑建议既严重错误(应用程序永远不能以root身份运行,最多只能作为本地助手),而且相对无意义,因为这是一个价值不高的4年老问题,不需要重新讨论。 - Chris Stratton
@ChrisStratton:感谢您纠正我,我已经修改了我的编辑建议。GitHub的评论员在今年2月份的GitHub评论中提到了这个Stack Overflow主题。 我同意GitHub评论员引用如此古老的主题是愚蠢的。 但他确实引用了它。 因为答案太旧了,因此有人浪费了时间对开源项目进行次优的提交。 - unforgettableidSupportsMonica
@ChrisStratton:我进行了谷歌搜索,但没有找到提到“svc power shutdown”解决方案的更新线程。如果未来出现这样的线程,我们应该将这个古老的线程标记为那个新线程的重复。很遗憾,谷歌似乎会给Stack Overflow线程如此古老的高搜索结果排名。也许我们可以在顶部添加一些陈旧内容警告。或者更好的是,也许我们应该将过时的问题标记为新的相同问题的重复。 - unforgettableidSupportsMonica
您的修改仍然将问题从所问的内容偏离。此外,在“Android”中不存在“root权限”这样的东西 - 这只存在于各种修改后的系统中的非标准方式中,因此将其强制添加到标题中只会分散注意力。 - Chris Stratton
@ChrisStratton:1. 即使用户已经将非标准的hack(例如SuperSU)强行加入到/system中,大多数人仍然会称操作系统为“Android”,尽管它已经不完全与Google发布的版本相同。这是因为它看起来、感觉和工作起来仍然非常像真正的Android。2. 总结往往是不完美的。我仍然认为我的新标题比原标题更好地概括了问题。你同意吗?3. 你能提出一个比我提出的标题更好的吗? - unforgettableidSupportsMonica
原标题更准确、更直接,避免了将一个四年前的低质量问题拖回主页顶部,却没有任何实际作用,只会扭曲提问者的意图,最终还需要再次恢复。 - Chris Stratton
4个回答

2
如果您的应用已经取得了root权限,那么请以root身份运行以下命令: am start -a android.intent.action.ACTION_REQUEST_SHUTDOWN

2
在Android 4.3或更高版本中,可能有更好的方法来关闭设备。
您的应用程序不需要安装为系统应用程序,但必须具有root权限。 您可以仅以root身份运行此命令,以关闭设备:
svc power shutdown
我感谢Firelord的答案(elsewhere),它启发了我发现此shell命令的存在。
我认为这将进行优雅的关机,但我不确定。也许它会做出突然的关机。请测试,然后编辑此答案以澄清。
此外,上述的 shell 命令在 Android 4.2.2 或更早版本中不起作用。帮助文本 没有提到这一点。svc 会拒绝该命令并显示一些帮助文本,以尝试提供帮助。

0
在Android源代码中,您可以找到以下内容:
/**
 * Low-level function turn the device off immediately, without trying
 * to be clean.  Most people should use
 * {@link android.internal.app.ShutdownThread} for a clean shutdown.
 *
 * @deprecated
 * @hide
 */
@Deprecated
public static native void shutdown();

我认为这个本地函数对应于你的su reboot -p。此外,你可以从引用代码注释中看到,你应该使用ShutdownThread来进行干净的关机。

在ShutdownThread中,Android做了很多事情。

  • 它关闭了ActivityManager。我认为关闭ActivityManager意味着所有活动将通过必要的生命周期,并且因此活动的状态将被存储。但我不确定。我没有检查。
  • 然后,Android关闭了蜂窝无线电接口。
  • 之后,它关闭了蓝牙。
  • 最后,它尝试关闭MountService。

因此,你可以看到做su reboot -p是错误的。


你刚刚问了你的方法是否正确。我向你展示了为什么这样做不是一个好的实践。我并没有告诉你在你的情况下 'shutdown()' 方法会起作用。 - Yury
我已经接受了你的答案,但是我的问题暗示着“关机的最佳实践应该是什么?”,但是没有人能够回答这个问题... :( - michelemarcon
实际上,这是最佳实践。但只有持有证书的用户才能使用它。如果您没有证书,用户应该使用电源按钮关闭设备,因此需要明确用户同意关闭设备。否则,恶意应用程序可以在未经用户许可的情况下关闭手机。 - Yury
1
没有第三方应用程序代码有权使用此方法。 - Chris Stratton

0

抱歉,我刚刚发现,它只适用于被签名为“系统应用程序”的应用程序,而不是用户应用程序。(只有在您知道固件签名密钥的情况下才可能实现) - devsnd
1
这是行不通的,因为没有第三方应用程序有权做到这一点。 - Chris Stratton

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接