You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React Native开发安卓锁屏应用:如何监听电源按键事件

监听安卓电源按键事件(React Native)

React Native本身没有提供直接监听电源键的API,需要通过安卓原生模块结合RN事件机制实现,以下是具体步骤:

一、实现安卓原生模块

1. 创建电源键监听模块类

在安卓项目的android/app/src/main/java/com/[你的项目包名]/路径下新建PowerKeyModule.java文件:

package com.yourprojectname;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.WritableMap;
import com.facebook.react.bridge.Arguments;
import com.facebook.react.modules.core.DeviceEventManagerModule;

public class PowerKeyModule extends ReactContextBaseJavaModule {
    private BroadcastReceiver powerKeyReceiver;

    public PowerKeyModule(ReactApplicationContext reactContext) {
        super(reactContext);
        setupPowerKeyReceiver();
    }

    @Override
    public String getName() {
        return "PowerKeyModule";
    }

    private void setupPowerKeyReceiver() {
        powerKeyReceiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                String action = intent.getAction();
                // 监听屏幕熄灭事件(电源键按下触发)
                if (Intent.ACTION_SCREEN_OFF.equals(action)) {
                    sendEvent("onPowerKeyPressed", Arguments.createMap());
                }
                // 可选:监听电源键按下弹出系统菜单的事件
                else if (Intent.ACTION_CLOSE_SYSTEM_DIALOGS.equals(action)) {
                    String reason = intent.getStringExtra("reason");
                    if ("globalactions".equals(reason)) {
                        sendEvent("onPowerKeyDown", Arguments.createMap());
                    }
                }
            }
        };

        IntentFilter filter = new IntentFilter();
        filter.addAction(Intent.ACTION_SCREEN_OFF);
        filter.addAction(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
        getReactApplicationContext().registerReceiver(powerKeyReceiver, filter);
    }

    private void sendEvent(String eventName, WritableMap params) {
        getReactApplicationContext()
                .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class)
                .emit(eventName, params);
    }

    @Override
    public void onCatalystInstanceDestroy() {
        super.onCatalystInstanceDestroy();
        // 注销广播接收器,避免内存泄漏
        getReactApplicationContext().unregisterReceiver(powerKeyReceiver);
    }
}

2. 创建模块注册类

同路径下新建PowerKeyPackage.java文件:

package com.yourprojectname;

import com.facebook.react.ReactPackage;
import com.facebook.react.bridge.NativeModule;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.uimanager.ViewManager;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class PowerKeyPackage implements ReactPackage {
    @Override
    public List<NativeModule> createNativeModules(ReactApplicationContext reactContext) {
        List<NativeModule> modules = new ArrayList<>();
        modules.add(new PowerKeyModule(reactContext));
        return modules;
    }

    @Override
    public List<ViewManager> createViewManagers(ReactApplicationContext reactContext) {
        return Collections.emptyList();
    }
}

3. 注册模块到应用

打开MainApplication.java,在getPackages()方法中添加模块注册:

@Override
protected List<ReactPackage> getPackages() {
    @SuppressWarnings("UnnecessaryLocalVariable")
    List<ReactPackage> packages = new PackageList(this).getPackages();
    // 添加自定义模块
    packages.add(new PowerKeyPackage());
    return packages;
}

二、React Native端监听事件

在RN组件中通过NativeEventEmitter接收原生模块发送的事件:

import { useEffect } from 'react';
import { NativeEventEmitter, NativeModules } from 'react-native';

const { PowerKeyModule } = NativeModules;
const powerKeyEmitter = new NativeEventEmitter(PowerKeyModule);

const LockScreenApp = () => {
    useEffect(() => {
        // 监听电源键触发的屏幕熄灭事件
        const screenOffSubscription = powerKeyEmitter.addListener(
            'onPowerKeyPressed',
            () => {
                console.log('电源键按下,屏幕已熄灭');
                // 执行你的锁屏业务逻辑
            }
        );

        // 可选:监听电源键按下弹出系统菜单的事件
        const powerDownSubscription = powerKeyEmitter.addListener(
            'onPowerKeyDown',
            () => {
                console.log('电源键被按下,系统菜单弹出');
            }
        );

        return () => {
            screenOffSubscription.remove();
            powerDownSubscription.remove();
        };
    }, []);

    return (
        // 你的组件布局
    );
};

export default LockScreenApp;

注意事项

  • 若你的锁屏应用需要后台持续监听,需申请RECEIVE_BOOT_COMPLETED权限,并将应用设置为设备管理员,避免被系统后台限制影响。
  • ACTION_CLOSE_SYSTEM_DIALOGS事件可能被其他系统操作触发,需通过reason字段判断是否为电源键触发。

内容的提问来源于stack exchange,提问作者Jhon Doe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 20:35:25