发送SCREEN_OFF和SCREEN_ON广播

android.intent.action.SCREEN_OFF和android.intent.action.SCREEN_ON广播的发送者

frameworks\base\services\core\java\com\android\server\power\Notifier.java

mScreenOnIntent

  mScreenOnIntent = new Intent(Intent.ACTION_SCREEN_ON);
    mScreenOnIntent.addFlags(
            Intent.FLAG_RECEIVER_REGISTERED_ONLY | Intent.FLAG_RECEIVER_FOREGROUND
            | Intent.FLAG_RECEIVER_VISIBLE_TO_INSTANT_APPS);
 private void sendWakeUpBroadcast() {
     if (DEBUG) {
         Slog.d(TAG, "Sending wake up broadcast.");
     }

 	PowerManager powerManager = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE);
     if (mActivityManagerInternal.isSystemReady() && powerManager.isInteractive()) {
         mContext.sendOrderedBroadcastAsUser(mScreenOnIntent, UserHandle.ALL, null,
                 mWakeUpBroadcastDone, mHandler, 0, null, null);
     } else {
 		Slog.d(TAG, "Not Sending wake up broadcast. pms isInteractive: " + powerManager.isInteractive());
         EventLog.writeEvent(EventLogTags.POWER_SCREEN_BROADCAST_STOP, 2, 1);
         sendNextBroadcast();
     }
 }

mScreenOffIntent

    mScreenOffIntent = new Intent(Intent.ACTION_SCREEN_OFF);
    mScreenOffIntent.addFlags(
            Intent.FLAG_RECEIVER_REGISTERED_ONLY | Intent.FLAG_RECEIVER_FOREGROUND
            | Intent.FLAG_RECEIVER_VISIBLE_TO_INSTANT_APPS);
    private void sendGoToSleepBroadcast() {
        if (DEBUG) {
            Slog.d(TAG, "Sending go to sleep broadcast.");
        }

        if (mActivityManagerInternal.isSystemReady()) {
            mContext.sendOrderedBroadcastAsUser(mScreenOffIntent, UserHandle.ALL, null,
                    mGoToSleepBroadcastDone, mHandler, 0, null, null);
        } else {
            EventLog.writeEvent(EventLogTags.POWER_SCREEN_BROADCAST_STOP, 3, 1);
            sendNextBroadcast();
        }
    }
要即时接收 ACTION_SCREEN_ON 和 ACTION_SCREEN_OFF 广播意图,你需要按照以下步骤操作: 1. **添加权限**:在 `AndroidManifest.xml` 中添加接收广播的权限: ```xml <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> <uses-permission android:name="android.permission.WAKE_LOCK" /> ``` 这允许你的应用在屏幕关闭后继续运行,并接收屏幕状态改变的通知。 2. **创建BroadcastReceiver**: 创建一个新的 BroadcastReceiver 类,例如 `MoodModeReceiver.java`: ```java public class MoodModeReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (action.equals(Intent.ACTION_SCREEN_ON)) { // 屏幕打开处理逻辑 } else if (action.equals(Intent.ACTION_SCREEN_OFF)) { // 屏幕关闭处理逻辑 } } } ``` 记得实现 `onReceive()` 方法来处理屏幕的状态改变。 3. **注册BroadcastReceiver**: 通常,你应该在 `Activity` 或 `Service` 的生命周期管理中注册接收器,而不是仅在屏幕关闭时: - 在 `onCreate()` 或 `onResume()` 注册: ```java registerReceiver(moodModeReceiver, new IntentFilter(Intent.ACTION_SCREEN_ON)); registerReceiver(moodModeReceiver, new IntentFilter(Intent.ACTION_SCREEN_OFF)); ``` - 在 `onDestroy()` 或 `onPause()` 解除注册: ```java unregisterReceiver(moodModeReceiver); ``` 4. **注意广播接收器的生命周期**: 确保你的BroadcastReceiver能生存长于ACTION_SCREEN_ON和ACTION_SCREEN_OFF广播,如果是在非活动状态下,可能需要额外的处理,比如使用JobScheduler。 5. **处理屏幕状态变化**: 在 `onReceive()` 方法内,根据ACTION_SCREEN_ON和ACTION_SCREEN_OFF的不同,执行相应的业务逻辑。 6. **检查Logcat**: 当出现问题时,可以在 Logcat 中查找错误消息来帮助定位问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值