在自定义广播接收器中,React 本机应用程序在从推送通知打开时崩溃



>我刚刚构建了一个本机模块,用于向 React Native 发出事件,所需的效果是获取通过 Braze 发送的推送通知,在 react native 中剥离它们的深层链接以适当地路由我的应用程序。如果应用程序在后台运行,这将非常有效,但如果它被关闭,则会导致崩溃,并在 Logcat 中出现以下错误:

10-02 15:11:34.888 20942-20942/com.my.app E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.my.app, PID: 20942
java.lang.RuntimeException: Unable to start receiver com.my.app.AppboyBroadcastReceiver: java.lang.NullPointerException: Attempt to invoke virtual method 'com.facebook.react.bridge.JavaScriptModule com.facebook.react.bridge.ReactApplicationContext.getJSModule(java.lang.Class)' on a null object reference
at android.app.ActivityThread.handleReceiver(ActivityThread.java:3259)
at android.app.ActivityThread.-wrap17(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1677)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6541)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'com.facebook.react.bridge.JavaScriptModule com.facebook.react.bridge.ReactApplicationContext.getJSModule(java.lang.Class)' on a null object reference
at com.my.app.AppboyNotification.sendEvent(AppboyNotification.java:36)
at com.my.app.AppboyBroadcastReceiver.onReceive(AppboyBroadcastReceiver.java:42)
at android.app.ActivityThread.handleReceiver(ActivityThread.java:3252)

我假设这是由于应用程序尚未正确启动并且已经在尝试触发不应该触发的内容。我的广播接收器看起来像这样,其中notificationOpenedAction.equals(action)被称为:

public class AppboyBroadcastReceiver extends BroadcastReceiver{
private static final String TAG = AppboyLogger.getAppboyLogTag(AppboyBroadcastReceiver.class);
@Override
public void onReceive(Context context, Intent intent) {
String packageName = context.getPackageName();
String pushReceivedAction = packageName + AppboyNotificationUtils.APPBOY_NOTIFICATION_RECEIVED_SUFFIX;
String notificationOpenedAction = packageName + AppboyNotificationUtils.APPBOY_NOTIFICATION_OPENED_SUFFIX;
String notificationDeletedAction = packageName + AppboyNotificationUtils.APPBOY_NOTIFICATION_DELETED_SUFFIX;
String action = intent.getAction();
Log.d(TAG, String.format("Received intent with action %s", action));
logNotificationDuration(intent);
if (pushReceivedAction.equals(action)) {
Log.d(TAG, "Received push notification.");
} else if (notificationOpenedAction.equals(action)) {
String deepLink = intent.getStringExtra(Constants.APPBOY_PUSH_DEEP_LINK_KEY);
WritableNativeMap params = new WritableNativeMap();
params.putString("appboyDeeplink", deepLink);
Log.d(TAG, "Received push open action notification.");
Log.d(TAG, String.format("DeeplinkData: %s", deepLink));
AppboyNotification.sendEvent("appboyNotificationReceived", params);
} else if (notificationDeletedAction.equals(action)) {
Log.d(TAG, "Received push notification deleted intent.");
} else {
Log.d(TAG, String.format("Ignoring intent with unsupported action %s", action));
}
}

My ActivityEventListener 如下:

public class AppboyNotification extends ReactContextBaseJavaModule implements ActivityEventListener{
private static final String TAG = "AppboyMessaging";
private static ReactApplicationContext reactContext;
private String thisApp;

public AppboyNotification(ReactApplicationContext reactContext){
super(reactContext);
this.reactContext = reactContext;
Log.d(TAG, String.format("React_context %s", reactContext));
reactContext.addActivityEventListener(this);
thisApp = reactContext.getPackageName();
}
@Override
public String getName() {
return TAG;
}
public static void sendEvent(String event, WritableNativeMap params) {
reactContext
.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class)
.emit(event, params);
}
@Override
public void onActivityResult(Activity activity, int requestCode, int resultCode, Intent data) {}
@Override
public void onNewIntent(Intent intent){}
}

和我的包文件:

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

public List<Class<? extends JavaScriptModule>> createJSModules() {
return Collections.emptyList();
}
@Override
public List<ViewManager> createViewManagers(ReactApplicationContext reactContext) {
return Collections.emptyList();
}
}

有没有办法避免此错误,并优雅地处理这个问题,以便当我从推送通知打开时,我仍然可以获得所需的数据?

我希望这对某人有所帮助。对我来说,问题是由react-native-simple-toast中调用Toast.show()方法引起的。