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

Android实现系统关机和重启

2017-05-27 17:29 375 查看
Android实现系统关机和重启

一、将APP提升至系统权限

在AndroidMenifest.xml中添加如下代码:
android:sharedUserId="android.uid.system"


二、 添加关机权限
<uses-permission android:name="android.permission.SHUTDOWN" />
注:经测试在AndroidMenifest.xml添加了该权限会有警告,而且不添加也可以实现关机,所以具体以运行的实际效果为主。

三、由于需要在源码中编译项目,所以要为项目编写mk文件,在项目根目录下添加Android.mk文件,内容如下所示:
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)

LOCAL_MODULE_TAGS := optional

LOCAL_SRC_FILES := $(call all-java-files-under, src)

LOCAL_PACKAGE_NAME := PowerActionDemo
LOCAL_CERTIFICATE := platform

include $(BUILD_PACKAGE)


四、实现代码

4.1、关机代码

4.1.1 使用广播方式实现
/**
* 关机
*
* @param v
*/
public void shutDown(View v) {
try {
// 源码中"android.intent.action.ACTION_REQUEST_SHUTDOWN“ 就是 Intent.ACTION_REQUEST_SHUTDOWN方法
Intent intent = new Intent("android.intent.action.ACTION_REQUEST_SHUTDOWN");
// 源码中"android.intent.extra.KEY_CONFIRM"就是 Intent.EXTRA_KEY_CONFIRM方法,
// 其中false换成true,会弹出是否关机的确认窗口
intent.putExtra("android.intent.extra.KEY_CONFIRM", true);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
} catch (Exception e) {
e.printStackTrace();
}
}
注:
代码中的“android.intent.action.ACTION_REQUEST_SHUTDOWN”就是Intent.ACTION_REQUEST_SHUTDOWN;
“android.inttent.extra.KEY_CONFIRM”就是Intent.EXTRA_KEY_CONFIRM.
由于在两个属性不对上层开放,所以就没有调用,直接写出来了;

4.1.2 通过反射调用实现

①、PowerManager类并没有提供关机的shutdown接口,而是通过IBinder这种Android中特有的通信模式,与PowerManagerService
类进行通信。PowerManagerService是PowerManager 类中定义的接口的具体实现,并进一步调用Power 类来与下一层进行通信. 在PowerManagerService实现了shutdown接口,power服务实现了关机功能。
②、PowerManager的实现通过IPowerManager来调用Power服务的接口。 IPowerManager是AIDL文件自动生成的类,便于远程通信。
③、IPowerManage.aidl文件目录“framework/base/core/java/android/os/IPowerManage.aidl”
④、IPowerManager实现了shutdown接口,所以,如果我们能够获得Power服务的IBinder,通过反射调用shutdown方法就能实现关机功能。 
需要注意的是,ServiceManager管理着系统的服务程序,它保存着所有服务的IBinder,通过服务名就能获取到这个服务的IBinder。 
但ServiceManager这个类也是HIDE的,也需要反射进行调用。两次,通过两次反射调用,就能调用power服务实现的关机功能。

/**
* 关机
* @param view
*/
public void shutDown(View view) {
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 (ClassNotFoundException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}


4.2、 重启代码

4.2.1 使用广播方式实现

/**
* 重启
*
* @param v
*/
public void reBoot(View v) {
try {
Intent intent2 = new Intent(Intent.ACTION_REBOOT);
intent2.putExtra("nowait", 1);
intent2.putExtra("interval", 1);
intent2.putExtra("window", 0);
sendBroadcast(intent2);
} catch (Exception e) {
e.printStackTrace();
}
}


4.2.2 调用PowerManager的reboot方法实现

/**
* 重启
* @param view
*/
public void reBoot(View view) {
try {
PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
pm.reboot("");
} catch (Exception e) {
e.printStackTrace();
}
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: