Android 发送进入休眠广播,实现自定义屏保功能

  1. 关闭系统屏保功能
    frameworks\base\core\res\res\values\config.xml
false

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;        }    }}
发表评论
留言与评论(共有 0 条评论) “”
   
验证码:

相关文章

推荐文章