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

  • 关闭系统屏保功能frameworksbasecoreresresvaluesconfig.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; } }}

    郑重声明:本文内容及图片均整理自互联网,不代表本站立场,版权归原作者所有,如有侵权请联系管理员(admin#wlmqw.com)删除。
    (0)
    用户投稿
    上一篇 2022年8月7日
    下一篇 2022年8月7日

    相关推荐

    联系我们

    联系邮箱:admin#wlmqw.com
    工作时间:周一至周五,10:30-18:30,节假日休息