- 关闭系统屏保功能
frameworks\base\core\res\res\values\config.xml
<bool name="config_dreamsEnabledByDefault">false</bool>
2.检测系统在即将进入休眠时,发送进入屏保广播
frameworks/base/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
--- a/alps/frameworks/base/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
+++ b/alps/frameworks/base/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
@@ -136,6 +136,12 @@ import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
+import android.app.ActivityManager;
+import android.app.ActivityManager.RunningTaskInfo;
+import android.os.BatteryManager;
import static android.view.WindowManager.LayoutParams.*;
import static android.view.WindowManagerPolicy.WindowManagerFuncs.LID_ABSENT;
import static android.view.WindowManagerPolicy.WindowManagerFuncs.LID_OPEN;
@@ -210,6 +216,16 @@ public class PhoneWindowManager implements WindowManagerPolicy {
static public final String SYSTEM_DIALOG_REASON_HOME_KEY = "homekey";
static public final String SYSTEM_DIALOG_REASON_ASSIST = "assist";
+
+ private String GOTO_SCREEN_SAVER = "com.intent.gotoScreenSaver";//自定义屏保广播
+ private int batteryStatus = -1;
/// M: for build type check
static final boolean IS_USER_BUILD = ("user".equals(Build.TYPE)
|| "userdebug".equals(Build.TYPE));
@@ -1443,6 +1459,13 @@ public class PhoneWindowManager implements WindowManagerPolicy {
filter = new IntentFilter(Intent.ACTION_USER_SWITCHED);
context.registerReceiver(mMultiuserReceiver, filter);
+ filter = new IntentFilter();
+ filter.addAction(Intent.ACTION_BATTERY_CHANGED);//接收电池状态广播
+ mContext.registerReceiver(new BatteryChangedReceiver (), filter, null, mHandler);
+
// monitor for system gestures
mSystemGestures = new SystemGesturesPointerEventListener(context,
new SystemGesturesPointerEventListener.Callbacks() {
@@ -5449,6 +5472,37 @@ public class PhoneWindowManager implements WindowManagerPolicy {
}
};
+ private final class BatteryChangedReceiver extends BroadcastReceiver {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ String action = intent.getAction();
+ if (action.equals(Intent.ACTION_BATTERY_CHANGED)) {
+ batteryStatus = intent.getIntExtra(BatteryManager.EXTRA_STATUS, -1);
+ }
+ }
+ }
+
BroadcastReceiver mMultiuserReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
@@ -5502,6 +5556,17 @@ public class PhoneWindowManager implements WindowManagerPolicy {
// Called on the PowerManager's Notifier thread.
@Override
public void goingToSleep(int why) {
+ Log.d(TAG," goingToSleep batteryStatust = " + batteryStatus + " why = " + why);
+ if(why == 3 && (batteryStatus == BatteryManager.BATTERY_STATUS_CHARGING || batteryStatus == BatteryManager.BATTERY_STATUS_FULL)){
+ PowerManager pm = (PowerManager)mContext.getSystemService(Context.POWER_SERVICE);
+ PowerManager.WakeLock wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "screensaver");
+ wakeLock.acquire(5000);
+ Log.d(TAG,"send goto screen saver broadcast!");
+ Intent dreamIntent = new Intent(GOTO_SCREEN_SAVER);
+ mContext.sendBroadcast(dreamIntent);
+ }
EventLog.writeEvent(70000, 0);
if (DEBUG_WAKEUP) Slog.i(TAG, "Going to sleep...");
在goingToSleep方法中判断系统是否进入休眠,其中why =2 表示按power键进入休眠,why = 3 表示系统自动进入休眠。因此发送屏保广播的条件是:why=3并且当前设备是充电状态或是充满状态时才发送屏保广播。
需要注意的是里面还加了wakeLock.acquire(5000);这个语句,是为了防止系统CPU直接进入休眠,而没有把屏保广播发送出去。
3.实现自定义屏保功能
在检测接收到"com.intent.gotoScreenSaver"屏保广播后,即可以调起自己要实现的屏保。
注:
接收到屏保广播后,要换醒屏幕,具体实现方法如下:
private void wake_up_screen(){
if(!pm.isScreenOn()){
wakeLock=pm.newWakeLock(PowerManager.ACQUIRE_CAUSES_WAKEUP | PowerManager.SCREEN_BRIGHT_WAKE_LOCK, "bright");
wakeLock.acquire();
if (wakeLock != null && wakeLock.isHeld()) {
wakeLock.release();
wakeLock = null;
}
}
}