【发布时间】:2014-07-11 08:49:57
【问题描述】:
我正在编写一个应用程序,该应用程序旨在在一个特定的设备型号(运行基于 Amlogic 的固件的 Android 机顶设备)上运行。我拥有 root 权限,并且我的应用程序使用固件证书进行了签名。
我的应用程序是设备的主要焦点,能够启动完全关机会很有帮助。
我没有shutdown 命令。我确实有reboot 命令。
reboot -p 没有帮助。它只是在保持开机状态时冻结设备。
PowerManager 好一点,但它将设备设置为睡眠模式,而不是完全关机:
PowerManager pm = (PowerManager)getSystemService(Service.POWER_SERVICE);
pm.goToSleep(SystemClock.uptimeMillis());
我对所有建议持开放态度- hacky 或其他。 Android版本预计保持4.2.2。
意图
此命令将导致设备重新启动。 Intent.ACTION_SHUTDOWN 似乎没有做任何事情。这个 Intent 可能只是报告关闭,而不是启动一个?
Intent i = new Intent(Intent.ACTION_REBOOT);
i.putExtra("nowait", 1);
i.putExtra("interval", 1);
i.putExtra("window", 0);
sendBroadcast(i);
我最幸运的是通过 Intent 请求关闭:
Intent i = new Intent("android.intent.action.ACTION_REQUEST_SHUTDOWN");
i.putExtra("android.intent.extra.KEY_CONFIRM", true);
startActivity(i);
关闭线程
这有点接近。绝对有趣。你能找到一个使用它的例子吗?
到目前为止,我想出了这个:
Class<?> sdClass = Class.forName("com.android.server.power.ShutdownThread");
Constructor<?> con = sdClass.getDeclaredConstructors()[0];
con.setAccessible(true);
for (Method m : sdClass.getDeclaredMethods()) {
if (m.getName().matches("shutdown")) {
m.setAccessible(true);
m.invoke(sdClass, PlayerActivity.this, false);
} else if (m.getName().matches("rebootOrShutdown")) {
m.setAccessible(true);
m.invoke(sdClass, PlayerActivity.this, false);
} else if (m.getName().matches("beginShutdownSequence")) {
m.setAccessible(true);
m.invoke(sdClass, PlayerActivity.this, false);
}
}
shutdown 和 beginShutdownSequence 创建 NullPointerExceptions(你明白为什么吗?)和 rebootOrShutdown 由于 UnsatisfiedLinkError 创建一个 InvocationTargetException... 它找不到本机方法:
java.lang.UnsatisfiedLinkError:找不到本机方法: com.android.server.power.PowerManagerService.nativeShutdown:()V 在 com.android.server.power.PowerManagerService.nativeShutdown(Native 方法)在 com.android.server.power.PowerManagerService.lowLevelShutdown(PowerManagerService.java:2163) 在 com.android.server.power.ShutdownThread.rebootOrShutdown(ShutdownThread.java:543) 在 com.android.server.power.ShutdownThread.run(ShutdownThread.java:393)
lowLevelShutdown 是所有功能最终达到的功能,当配置为关闭(而不是重新启动)时。所以弄清楚如何避免这个链接错误可能是关键。
【问题讨论】:
-
没有。缺少关闭命令。重新启动会冻结设备。电源管理器没有实际关闭设备的选项。只能休眠并重新启动。
-
请看下面Manty和cmets的回答,好像有shutdown命令。
-
你需要root权限,你可以点击@hungr发布的链接..
-
@Manty:该答案使用“关机”。如前所述,我没有可用的。该链接的所有结果都不适合我。
标签: android