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. android+XML使用
  2. android 如何使用Parcelable接口
  3. Android(安卓)数据库SQLite的使用简单Demo
  4. android WebView加载html5介绍
  5. Android实现页面悬浮显示
  6. 深入浅出RxJava四-在Android中使用响应式编程
  7. 箭头函数的基础使用
  8. NPM 和webpack 的基础使用
  9. Python list sort方法的具体使用

随机推荐

  1. linux tar.gz zip 解压缩 压缩命令
  2. 改变 Android(安卓)EditText 的边框
  3. Android(安卓)三种方式实现圆形ImageView
  4. Android(安卓)Activity设置全屏
  5. android音频播放简单示例
  6. Android(安卓)WiFi code
  7. Android(安卓)--- 图片的特效处理
  8. Android中自定义Dialog常用的两种方式
  9. android 自带的contacts2.db数据库表结构
  10. Android(安卓)TextView 实现跑马灯效果