android之PowerManager 与电源管理,解决灭屏状态下来短信屏幕不会点亮问题

原创 2016年08月31日 11:21:58

  可解决灭屏状态下来短信屏幕不会点亮问题   

PowerManager这个类主要是用来控制电源状态的. 通过使用该类提供的api可以控制电池的待机时间,一般情况下不要使用。如果确实需要使用,那么尽可能的使用最低级别的WakeLocks锁,并且确保使用完后释放它。

首先获取实例,通过context.getSystemService(Context.POWER_SERVICE)的方式获得PowerManager的实例。

在PowerManager中,最主要的newWakeLock方法,如下:

    public WakeLock newWakeLock(int flags, String tag)
    {
        return new WakeLock(flags, tag);
    }
    这个方法将创建WakeLock对象,通过调用此对象的方法你就可以方便的去控制电源的状态。方法如下:
   
    PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
    PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK, "My Tag");
    wl.acquire();
      屏幕将停留在设定的状态,一般为亮、暗状态
    wl.release();
      释放掉正在运行的cpu或关闭屏幕。



下面定义的flag是在newWakeLock方法中要接收的参数,通过该flag,你可以定义系统的电源的展示效果。比如:
 *                                               cpu       screen       keyboard
 * PARTIAL_WAKE_LOCK                on         off           off
 * SCREEN_DIM_WAKE_LOCK        on         dim           off
 * SCREEN_BRIGHT_WAKE_LOCK   on         bright        off
 * FULL_WAKE_LOCK                    on         bright        bright
 
  这些flag是相互排斥的,一次只能定义一个。

 

如果你持有PARTIAL_WAKE_LOCK锁,不论任何定时器甚至是按下电源按钮,cpu都将继续运行,无法进入休眠状态。除非你释放掉它。
其他锁的话,虽然cpu也在运行,但是当用户按下电源按钮时,设备将立刻进入休眠状态。

 

 正常情况下wakelocks实际上是没有被打开的,当需要时,它将通过特定的flag启动屏幕和键盘。 比如在应用中,涉及到向用户发送消息时,需要让用户立刻看到。此时会点亮屏幕。当WakeLock锁被释放的时候,activity的定时器将被重设,这将导致屏幕亮更长的时间



下面的代码是我在开发中遇到的关于灭屏状态下来短信屏幕不会点亮问题的修改,由于代码较多,此处只贴出修改过的地方

 packages/apps/Messaging/src/com/android/messaging/receiver/SmsReceiver.java -
index cee7c5b..d1d3216 100644
@@ -27,6 +27,7 @@ import android.text.TextUtils;
 import android.util.Log;
 import android.content.pm.PackageManager;
 import android.content.res.Resources;

+import android.os.PowerManager;
 import android.provider.Telephony;
 import android.provider.Telephony.Sms;
 import android.support.v4.app.NotificationCompat;
@@ -76,6 +77,8 @@ public final class SmsReceiver extends BroadcastReceiver {
     private static final String TAG = LogUtil.BUGLE_TAG;
 
     private static ArrayList<Pattern> sIgnoreSmsPatterns;
+    private static final int WAKE_LOCK_TIMEOUT = 5000;
+    private static PowerManager.WakeLock mWakeLock;

 
     /**
      * Enable or disable the SmsReceiver as appropriate. Pre-KLP we use this receiver for
@@ -89,7 +92,6 @@ public final class SmsReceiver extends BroadcastReceiver {
         boolean mmsWapPushReceiverEnabled;
         boolean respondViaMessageEnabled;
         boolean broadcastAbortEnabled;
-
         if (OsUtil.isAtLeastKLP()) {
             // When we're running as the secondary user, we don't get the new SMS_DELIVER intent,
             // only the primary user receives that. As secondary, we need to go old-school and
@@ -198,6 +200,9 @@ public final class SmsReceiver extends BroadcastReceiver {
             LogUtil.e(TAG, "processReceivedSms: null or zero or ignored message");
             return;
         }
+        PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
+        mWakeLock = pm.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, "updateNewMessageIndicator");
+         mWakeLock.setReferenceCounted(true);

         
         final int errorCode = intent.getIntExtra(EXTRA_ERROR_CODE, 0);
         // Always convert negative subIds into -1
@@ -209,6 +214,7 @@ public final class SmsReceiver extends BroadcastReceiver {
             final String format = null;
             DebugUtils.dumpSms(messages[0].getTimestampMillis(), messages, format);
         }
+        mWakeLock.acquire(WAKE_LOCK_TIMEOUT);
     }
 
     public static void deliverSmsMessages(final Context context, final int subId,












版权声明:本文为博主原创文章,未经博主允许不得转载。

android 如何在activity中控制屏幕点亮与关闭

Android中通过各种Lock锁对电源进行控制需要注意:加锁和解锁必须成对出现。 //启用屏幕常亮功能 private PowerManager.WakeLock mWakeLock; pri...
  • sergeycao
  • sergeycao
  • 2012年11月09日 09:52
  • 1299

Android如何在activity中控制屏幕点亮与关闭

Android中通过各种Lock锁对电源进行控制,需要注意的是加锁和解锁必须成对出现。 //启用屏幕常亮功能 PowerManager pm =(PowerManager) getSystemSer...
  • q925092273
  • q925092273
  • 2016年09月06日 16:28
  • 1405

android设置屏幕禁止休眠的方法

实现这一功能的方法有两种,一种是在Manifest.xml文件里面声明,一种是在代码里面修改LayoutParams的标志位。具体如下: 1、在Manifest.xml文件里面用user-permis...
  • zcj331
  • zcj331
  • 2014年04月11日 13:27
  • 3418

android 屏幕保持唤醒 不锁屏 android.permission.WAKE_LOCK

In AndroidManifest.xml 加上权限: 方法一:public class UnLockActivity2 extends Activity { /** Called when t...
  • toto1297488504
  • toto1297488504
  • 2015年06月02日 23:57
  • 3091

Android 保持屏幕唤醒不熄灭

这两天工作比较忙,没有时间更新博客。今天难得闲下来,总结一下之前写的一个Demo,用到了两个小知识点:一是使用Thread加Handler实现计时,二是控制屏幕唤醒不熄灭。 首先是计时,首先我使用单纯...
  • zhoumushui
  • zhoumushui
  • 2014年12月16日 18:45
  • 8900

android保持服务不休眠(持续运行)以及唤醒屏幕的方法

假设有这样一个应用场景,一个服务一直在默默的工作(比如即时地获取服务器的消息),即使在屏幕已经因为长时间无操作而关闭,或者用户按了电源键让屏幕关闭,手机进入休眠状态,他必须依然在工作中。一旦从服务器获...
  • wzj0808
  • wzj0808
  • 2016年09月21日 16:03
  • 6228

Android7.0 PowerManagerService亮灭屏分析(一)

绪论 可以导致手机亮灭屏的因素有多种,而在本文中主要讲解按power键亮灭屏过程以及来电亮屏。在亮灭屏过程power中主要的实现类与功能如下所述: PowerManagerService.java:以...
  • fu_kevin0606
  • fu_kevin0606
  • 2017年01月13日 14:11
  • 5292

android中获取手机屏幕点亮状态---点亮屏幕

我主要是运用在用户在锁屏状态下收到新的通知时,同时能够点亮屏幕。一个工具类package com.example.testone;import android.content.Context; imp...
  • qq_31430261
  • qq_31430261
  • 2016年02月05日 10:28
  • 3196

【android开发】动态设置屏幕常亮/不常亮

开发过程中,遇到了在某种情况下需要保持屏幕常亮,某种情况下又不保持常亮的情况。将实现代码记录如下。 1、首先需要声明权限: 2、获取PowerManger对象和WakeLock对象。powerM...
  • LanTingShuXu
  • LanTingShuXu
  • 2016年12月08日 16:12
  • 1075

Android 设置屏幕不待机

转自:http://blog.csdn.net/yudajun/article/details/7748760 最近做项目时正好用到,进行了一下总结: Android设置支部待机有两种方法...
  • obmeflbj
  • obmeflbj
  • 2013年12月24日 12:04
  • 3207
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:android之PowerManager 与电源管理,解决灭屏状态下来短信屏幕不会点亮问题
举报原因:
原因补充:

(最多只允许输入30个字)