您的位置:首页 > 移动开发 > Android开发

Android 重启的几种方式

2016-02-19 18:56 507 查看
客户需要一个重启接口,尝试了以下几种方式实现:

1.广播方式,最终采用这种方式。这种重启方式有个过程,会显示“正在关机”对话框。需要uid为system的应用执行:

private void normalReboot(){
try {
Intent intent = new Intent(Intent.ACTION_REBOOT);
intent.putExtra("nowait", 1);
intent.putExtra("interval", 1);
intent.putExtra("window", 0);
context.sendBroadcast(intent);
} catch (Exception e) {}
}


当然,可以不显示对话框,但是流程还是会走:

代码位置:frameworks/base/services/java/com/android/server/power/ShutdownThread.java

--- a/frameworks/base/services/java/com/android/server/power/ShutdownThread.java
+++ b/frameworks/base/services/java/com/android/server/power/ShutdownThread.java
@@ -407,7 +407,7 @@ public final class ShutdownThread extends Thread {
pd.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG);
/* To fix video+UI+blur flick issue */
pd.getWindow().addFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
-                    pd.show();
+                    // pd.show();
}
sInstance.mHandler.postDelayed(mDelayDim, screenTurnOffTime);
}


2.命令行方式,实测执行没有效果,应该是没有Root权限

private void forceReboot(){
String cmd = "su -c reboot";
try {
Runtime.getRuntime().exec(cmd);
} catch (Exception e) {
}
}


3.通过SystemProperties触发执行脚本方式,实测这种方式没有效果,应该是步骤③的脚本无法执行,分析是权限问题:

①在init.rc添加重启服务,当属性app.tchip.reboot为1时触发:

#Reboot Start
#disabled:服务不会自动运行,必须显式地通过服务器来启动。
#oneshot:当此服务退出时不会自动重启。
service tchipRebootService /system/bin/tchipreboot.sh
disabled
oneshot
on property:app.tchip.reboot=1
start tchipRebootService
#Reboot End


②在system/core/init/property_service.c增加app.tchip.reboot属性,初始值为0:

{ "app.tchip.reboot", AID_SYSTEM, 0}, // add for reboot


③编写tchipreboot.sh,编译到out/.../system/bin/下,内容如下:

#!/system/bin/sh
reboot


④Java代码中改变app.tchip.reboot属性值,触发重启:

SystemProperties.set("app.tchip.reboot","1");
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: