Android进入suspend状态(goToSleep)
Android有个很有趣的现象,公开的API把系统进入suspend的功能移除了,开发者想让Android机器进入suspend状态,必须使用reflect机制(这种感觉,极为类似N多年前有一本书专门介绍Windows未公开的API )。
不明白Google为什么这么做,唯一的猜测,是为了安全考虑。但是,对于某些应用场景,还是需要程序控制Suspend/resume的。
下面简单介绍其使用,
1. 如果需要使用suspend/resume功能,需要在AndroidManifest.xml声明获得“DEVICE_POWER”权限和系统权限,示例代码如下,
<?xml version="1.0" encoding="utf-8"?>
2. 仅仅声明权限是不够的,要想拥有system权限,还需要sign,每一款产品的sign key都不一样,这就造成,即使可以在某一款产品上运行,在其他产品上也是无法运行的(需要使用该产品的sign key重新sign)。
另外,还有一种方法,直接把apk push到文件夹“/system/priv-app/”下,这种方法我没有尝试,我一般使用sign key的方式。
adb remountadb push xxx.apk /system/priv-app/adb reboot
3. 下面是代码实现部分,仅供参考,
进入suspend/sleep的代码段如下,
public static void goToSleep(Context context) { PowerManager powerManager= (PowerManager)context.getSystemService(Context.POWER_SERVICE); try { powerManager.getClass().getMethod("goToSleep", new Class[]{long.class}).invoke(powerManager, SystemClock.uptimeMillis()); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } catch (NoSuchMethodException e) { e.printStackTrace(); }}
屏幕唤醒的代码段如下,
public static void wakeUp(Context context) { PowerManager powerManager= (PowerManager)context.getSystemService(Context.POWER_SERVICE); try { powerManager.getClass().getMethod("wakeUp", new Class[]{long.class}).invoke(powerManager, SystemClock.uptimeMillis()); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } catch (NoSuchMethodException e) { e.printStackTrace(); } }
4. 如果不使用上面的reflect方法,还有没有其他方法?
据我所查,还有一种不是特别好的方法,即降低SDK版本到20以下,需要做如下更改,
4.1 build.gradle中请指定SDK版本为20以下,参考如下代码,注意“compileSdkVersion”已经更改为20,
apply plugin: 'com.android.application'android { compileSdkVersion 20 buildToolsVersion "23.0.2" defaultConfig { applicationId "com.example.suspendresume" minSdkVersion 14 targetSdkVersion 17 } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt' } }}dependencies { }
4.2 请在AndroidManifest.xml声明获得“DEVICE_POWER”权限和系统权限, 安装apk前需要sign。
4.3 不使用reflect方式的参考代码如下,
private static void enterSuspend(Context context){ PowerManager pm = (PowerManager)context.getSystemService(Context.POWER_SERVICE); pm.goToSleep(SystemClock.uptimeMillis());}
5. 如果有该平台的BSP代码,也可以把自己的代码放到BSP中编译,然后直接包进system image,会省去reflect和sign的动作,不过debug稍微麻烦。
好了,关于奇怪的goToSleep就分享这么多,希望能为有需要的童鞋提供帮助。
更多相关文章
- android+XML使用
- android 如何使用Parcelable接口
- Android(安卓)数据库SQLite的使用简单Demo
- android WebView加载html5介绍
- Android实现页面悬浮显示
- 深入浅出RxJava四-在Android中使用响应式编程
- 箭头函数的基础使用
- NPM 和webpack 的基础使用
- Python list sort方法的具体使用