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

  1. 关闭系统屏保功能
    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;
        }
    }
}
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

最乱纷飞的code

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值