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
相关产品推荐
相关产品推荐

