Android下react-native-push-notification后台点击通知onNotification未触发
嘿,我之前在处理node-pushnotification的GCM通知时也碰到过几乎一模一样的问题,给你几个实际排查和解决的方向,你可以逐一试试:
检查AndroidManifest.xml的Activity配置
后台点击通知启动App时,系统会通过Intent唤起你的主Activity,如果Activity的Intent Filter或Flags配置不对,可能会导致通知数据无法传递到onNotification回调。确保你的主Activity配置了正确的Flags,比如:<activity android:name=".MainActivity" android:launchMode="singleTop" android:exported="true"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity>这里的
singleTop模式能避免创建新的Activity实例,确保通知数据能被已存在的实例捕获。确认
popInitialNotification的初始化时机
虽然你试过设置true和false,但如果初始化PushNotification.configure()的时机太晚(比如在组件挂载后才调用),App启动时可能已经错过了捕获初始通知的时机。一定要把初始化代码放在App启动的最早期,比如index.js的最顶部,甚至在导入组件之前:// index.js 最顶部 import PushNotification from 'react-native-push-notification'; PushNotification.configure({ onNotification: (notification) => { console.log('收到通知:', notification); // 别忘了调用finish,否则某些Android版本会重复触发 notification.finish(); }, popInitialNotification: true, requestPermissions: true }); // 之后再导入其他组件和启动App import App from './App';切换到
data格式的Payload
GCM的通知Payload分两种:notification字段是系统级通知,后台点击时系统直接启动App,但不会主动把数据传递到onNotification;而data字段是自定义数据,不管前台后台,点击通知都会触发onNotification。你可以修改服务端的发送代码,改用纯data格式:// 服务端node-pushnotification配置 const push = new PushNotification({ gcm: { apiKey: '你的GCM密钥' } }); const payload = { data: { title: '测试通知', message: '后台点击也能触发onNotification', customKey: '自定义数据' } }; push.send(payload, (err, result) => { if (err) console.error(err); else console.log(result); });排查模拟器的兼容性问题
部分Android模拟器的通知处理逻辑和真机有差异,比如某些旧版本模拟器在后台点击通知时,Intent的数据会丢失。建议你找一台Android真机测试,排除模拟器本身的问题。
内容的提问来源于stack exchange,提问作者Noah

