false
2.檢測(cè)系統(tǒng)在即將進(jìn)入休眠時(shí),發(fā)送進(jìn)入屏保廣播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);//接收電池狀態(tài)廣播+ 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方法中判斷系統(tǒng)是否進(jìn)入休眠,其中why =2 表示按power鍵進(jìn)入休眠,why = 3 表示系統(tǒng)自動(dòng)進(jìn)入休眠。因此發(fā)送屏保廣播的條件是:why=3并且當(dāng)前設(shè)備是充電狀態(tài)或是充滿狀態(tài)時(shí)才發(fā)送屏保廣播。
需要注意的是里面還加了wakeLock.acquire(5000);這個(gè)語(yǔ)句,是為了防止系統(tǒng)CPU直接進(jìn)入休眠,而沒有把屏保廣播發(fā)送出去。
3.實(shí)現(xiàn)自定義屏保功能在檢測(cè)接收到”com.intent.gotoScreenSaver”屏保廣播后,即可以調(diào)起自己要實(shí)現(xiàn)的屏保。注:接收到屏保廣播后,要喚醒屏幕,具體實(shí)現(xiàn)方法如下:
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; } }}