其实重启是比较简单,较难的反而是关机。因为关机需要获取系统的权限,这个过程是比较麻烦的。废话不多说,直接上代码:
首先,配置AndroidManifest.xml文件,加上:android:sharedUserId="android.uid.system"
<span style="font-size:14px;"> <manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.xxxxxx"
android:sharedUserId="android.uid.system"
android:versionCode="1"
android:versionName="1.0" > </span>
通过shareUserId,拥有同一个User id的多个APK就可以配置成运行在同一个进程中,那么把程序的UID配成android.uid.system,也就是要让程序运行在系统进程中,这样就可以拥有系统权限。
升级要记得版本号要比旧版本大!
然后,配置应用需要的权限:
<span style="font-size:14px;"> <uses-permission android:name="android.permission.SET_TIME" />
<uses-permission android:name="android.permission.SHUTDOWN" />
<uses-permission android:name="android.permission.MODIFY_PHONE_STATE" />
<uses-permission android:name="android.permission.DEVICE_POWER" /></span>
会提醒:“Permission is only granted to system apps”的错误,意思是“权限只对系统应用授权”,不用担心,只需要project->clean,点击确定提醒就消失了。具体执行代码:
public void reboot() {
// TODO 重启
Intent i = new Intent(Intent.ACTION_REBOOT);
i.putExtra("nowait", 1);
i.putExtra("interval", 1);
i.putExtra("window", 0);
sendBroadcast(i);
}
public void shutDown() {
// TODO 关机
try {
// 获得ServiceManager类
Class
ServiceManager = Class
.forName("android.os.ServiceManager");
// 获得ServiceManager的getService方法
Method getService = ServiceManager.getMethod("getService",
java.lang.String.class);
// 调用getService获取RemoteService
Object oRemoteService = getService.invoke(null,
Context.POWER_SERVICE);
// 获得IPowerManager.Stub类
Class
cStub = Class.forName("android.os.IPowerManager$Stub");
// 获得asInterface方法
Method asInterface = cStub.getMethod("asInterface",
android.os.IBinder.class);
// 调用asInterface方法获取IPowerManager对象
Object oIPowerManager = asInterface
.invoke(null, oRemoteService);
// 获得shutdown()方法
Method shutdown = oIPowerManager.getClass().getMethod(
"shutdown", boolean.class, boolean.class);
// 调用shutdown()方法
shutdown.invoke(oIPowerManager, false, true);
} catch (Exception e) {
e.printStackTrace();
}
}
最后,签名。
完成以上步骤后编译出来的apk文件是不能使用的,这个签名是编译器默认的Debug签名,而不是系统签名。Android系统有的权限是基于签名的,签名不对,也就不能获取相应的权限。那么怎样获取系统签名呢?
1、找到目标系统的源代码,进入build/target/product/security ,找到platform.pk8和platform.x509.pem这两个文件,这是系统默认使用的密钥。
2、已经有密钥了,现在需要签名的工具:signapk.jar文件。signapk.jar的源码位置build/tools/signapk,你可以自己编译成jar文件。或者你如果懒得做,还可以直接在目录中搜索“signapk.jar”,反正我就是这么找到的。。。
3、最好将这几个文件和未签名的apk文件放在一个目录,然后执行命令: java -jar signapk.jar platform.x509.pem platform.pk8 old.apk new.apk。
这条命令的意思是:通过signapk.jar签名工具,以“platform.x509.pem”这个公钥文件和“platform.pk8”这个私钥文件对“old.apk”进行签名,签名后的文件保存为“new.apk”。搞定!
参考:http://blog.youkuaiyun.com/u014375869/article/details/38470039