在自定义广播接收器中通过推式通知打开时反应本机应用崩溃

时间:2018-10-02 21:22:17

标签: android react-native push-notification broadcastreceiver react-native-native-module

我刚刚构建了一个本机模块,用于向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));
        }
    }

我的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();
    }
}

是否有某种方法可以避免此错误,并能妥善处理,因此当我从推送通知中打开时,仍然可以获得所需的数据?

0 个答案:

没有答案