Android系统关机和重启

news/2024/10/16 20:21:22/

 一. 发送系统广播方式

    Broadcast是Android的四大基本组件之中的一个。也就是我们常说的广播。Android系统本身就包括了很多广播,时时刻刻在监听着系统中注冊的每个广播并随时准备响应操作。

当中,就有关于关机或重新启动的广播:Intent.ACTION_REQUEST_SHUTDOWN和Intent.ACTION_REBOOT,通过发送这两个广播。Android就能自己主动接收广播。并响应关机或重新启动的操作。ACTION_REQUEST和ACTION_REBOOT是Intent.java是声明的两个字符串常量

   public static final String ACTION_REBOOT ="android.intent.action.REBOOT ";public static final String ACTION_REQUEST_SHUTDOWN = "android.intent.action.ACTION_REQUEST_SHUTDOWN ";

Intent.java位于源代码/frameworks/base/core/java/android/content/Intent.java以下。详细实现方法例如以下

//广播方式关机重新启动case R.id.shutdown_btn1:Log.v(TAG, "broadcast->shutdown ");Intent intent = new Intent(Intent.ACTION_REQUEST_SHUTDOWN);intent.putExtra(Intent.EXTRA_KEY_CONFIRM, false);//当中false换成true,会弹出是否关机的确认窗体intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);startActivity(intent);break;case R.id.reboot_btn1:Log.v(TAG, "broadcast->reboot ");Intent intent2 = new Intent(Intent.ACTION_REBOOT);intent2.putExtra("nowait ", 1);intent2.putExtra("interval ", 1);intent2.putExtra("window ", 0);sendBroadcast(intent2);  break;

须要注意的几点是:

第一。如前面所说,须要将APP提升至系统权限,详细做法是在AndroidMenifest.xml中加入例如以下代码

android:sharedUserId="android.uid.system "

第二,同一时候须要加入关机权限

<uses-permission android:name="android.permission.SHUTDOWN " />

第三,在Eclipse中,代码中的Intent.ACTION_REQUEST_SHUTDOWN 及 Intent.EXTRA_KEY_CONFIRM 在Eclipse IDE中报错,还是和前面说的一样,这两个属性不正确上层开放,假设把项目放在源代码中进行编译,是能够编译通过的。

第四,因为须要在源代码中编译项目,所以须要为项目编写mk文件,在项目根文件夹下加入Android.mk文件。内容例如以下所看到的:

LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)LOCAL_MODULE_TAGS := optionalLOCAL_SRC_FILES := $(call all-java-files-under, src)LOCAL_PACKAGE_NAME := PowerActionDemo
LOCAL_CERTIFICATE := platforminclude $(BUILD_PACKAGE) 

最后,将编译生成的apk文件,通过adb push到机器上就能够验证功能了。

二 . PowerManager reboot以及反射调用PowerManagerService shutdown

1. PowerManager提供了reboot等接口,因此,利用PowerManager实现重新启动,就比較简单。

PowerManager pManager=(PowerManager) getSystemService(Context.POWER_SERVICE);  //重新启动到fastboot模式pManager.reboot(" "); 

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服务实现的关机功能。

try {//获得ServiceManager类Class<?> ServiceManager = Class.forName("android.os.ServiceManager ");//获得ServiceManager的getService方法Method getService = ServiceManager.getMethod("getService ", java.lang.String.class);//调用getService获取RemoteServiceObject 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) {         Log.e(TAG, e.toString(), e);        }

http://www.ppmy.cn/news/799644.html

相关文章

android 重启手机的方法

android手机有很多的第三方固件&#xff0c;其中有不少固件中有reboot的功能&#xff0c;这个功能是如何实现的呢&#xff1f;我这里会做一个简单的示例。先看一个效果图吧&#xff01; 如图在dialog中的最后一项是reboot功能。下面看看代码是怎么修改的&#xff1a; 文件路径&…

三星NOTE2 重启开机后3秒死机故障解决思路

前几天陆续安装了google一键安装套件&#xff0c;系统优化等各式软件。购买了wm1耳机到货&#xff0c;但安装软件后识别有点问题&#xff0c;手机进行了重启。 万万没有想到这么悲催的事情被我遇到了&#xff0c;重启后&#xff0c;进行操作&#xff0c;在开机进入界面3-5秒后死…

SpringBoot-定义实体类并且相关联

在Spring Boot中定义班级&#xff08;Class&#xff09;和学生&#xff08;Student&#xff09;的实体类&#xff0c;并建立班级的主键和学生的外键关联&#xff0c;可以按照以下方式进行定义。 Class&#xff08;班级&#xff09;实体类&#xff1a; import javax.persisten…

Qt QML入门

Qt QML模块为使用QML语言开发应用程序和库提供了一个框架。它定义并实现了语言和引擎基础结构&#xff0c;并提供了一个API&#xff0c;使应用程序开发人员能够使用自定义类型扩展QML语言&#xff0c;并将QML代码与JavaScript和C集成在一起。 Qt QML模块提供了QML API和c API。…

EC6108V9/V9C-Hi3798MV100-当贝纯净桌面-卡刷固件包

EC6108V9&#xff0f;V9C-Hi3798MV100-当贝纯净桌面-卡刷固件包-内有教程 特点&#xff1a; 1、适用于对应型号的电视盒子刷机&#xff1b; 2、开放原厂固件屏蔽的市场安装和u盘安装apk&#xff1b; 3、修改dns&#xff0c;三网通用&#xff1b; 4、大量精简内置的没用的软…

XP电源维修fleXPower电源X7-2J2J2P-120018系列详解

XP Power适配器顶部插头&#xff08;壁插式&#xff09;电源ACM系列推出新系列。12 W的ACM12&#xff0c;24 W的ACM24和36 W的ACM36模块都符合工业和医用应用需要满足的新版能效和安规标准。 ACM系列大空载功率损耗为75 mW &#xff0c;符合产品销往美国市场需要满足的新版VI等…

WIN7中如何卸载IE8或IE9

卸载IE9&#xff1a; 以下说明适用于 Windows 7 和 Windows Vista。 单击“开始”按钮 &#xff0c;在搜索框中键入“程序和功能”&#xff0c;然后单击左窗格中的“查看已安装的更新”。 在“卸载更新”下&#xff0c;向下滚动到“Microsoft Windows”部分。 右键单击“Windo…

卸载sql server 2008的错误解决

自己学习sql server&#xff0c;用win7 home basic安装了sql server 2008&#xff0c;后来看到版本出了 2008 r2&#xff0c;所以也安上了&#xff0c;其实主要使用管理工具查查数据。后来发现eclipse里可以通过架包达到相同的效果&#xff0c;而且eclipse是绿色的体积小。就决…