可解决灭屏状态下来短信屏幕不会点亮问题
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,