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就分享这么多,希望能为有需要的童鞋提供帮助。

 

 

 

更多相关文章

  1. 运行时权限解析以及申请的实现(可完美解决java.lang.SecurityExce
  2. 代码虚拟的[小代码]在Android和PHP之间的加密/解密,AES加密
  3. 转载:Android 获取ROOT权限原理解析
  4. Android中几种图像特效处理方法小结
  5. android 笔记 --- Android界面刷新的方法
  6. Android: java应用程序进程启动过程的代码分析
  7. 在Android的c/c++代码中使用LOG

随机推荐

  1. android创建通知栏(java版)
  2. Android(安卓)NDK之发送短信
  3. Android(安卓)通过GPS进行定位
  4. 多线程例子 android camera capture
  5. Android(安卓)图片拖动 放大
  6. android Progressbar使用
  7. Android(安卓)调用联系人列表,选择联系人
  8. Android(安卓)官方架构组件之 Lifecycle
  9. Android(安卓)GPS获取当前位置信息
  10. PullToRefreshScrollView和Banner