xialin
xialin

Reputation: 7756

PushWoosh - add custom broadcast receiver

What I want to achieve: upon receiving PushWoosh notification, check the payload and direct user to specific activity accordingly.

I'm following an example in PushWoosh FAQ section regarding

Using Custom Push Broadcast Receiver in Android

However, I'm unable to receive any push inside my custom push..

Here's the AndroidManifest.xml:

        <receiver
            android:name="com.google.android.gcm.GCMBroadcastReceiver"
            android:exported="true"
            android:permission="com.google.android.c2dm.permission.SEND">
            <intent-filter>
                <action android:name="com.google.android.c2dm.intent.RECEIVE" />
                <action android:name="com.google.android.c2dm.intent.REGISTRATION" />

                <category android:name="${applicationId}" />
            </intent-filter>
        </receiver>

        <receiver android:name=".receivers.PWBroadcastReceiver">
            <intent-filter>
                <action android:name="${applicationId}.com.arellomobile.android.push.REGISTER_BROAD_CAST_ACTION"/>
            </intent-filter>
        </receiver>
        <service android:name="com.arellomobile.android.push.PushGCMIntentService" />

This is my custom broadcast receiver:

public class PWBroadcastReceiver extends BroadcastReceiver {

    private static final String TAG = "PWBroadcastReceiver";

    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent == null)
            return;

        // Let Pushwoosh SDK to pre-handling push (Pushwoosh track stats, opens rich pages, etc.).
        // It will return Bundle with a push notification data
        Bundle pushBundle = PushManager.preHandlePush(context, intent);
        if (pushBundle == null)
            return;

        // Get push bundle as JSON object
        JSONObject dataObject = PushManager.bundleToJSON(pushBundle);

        // Get default launcher intent for clarity
        Intent launchIntent = context.getPackageManager().getLaunchIntentForPackage(context.getPackageName());
        launchIntent.addCategory("android.intent.category.LAUNCHER");

        launchIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);

        // Put push notifications payload in Intent
        launchIntent.putExtras(pushBundle);
        launchIntent.putExtra(PushManager.PUSH_RECEIVE_EVENT, dataObject.toString());

        // Start activity!
        context.startActivity(launchIntent);

        // Let Pushwoosh SDK post-handle push (track stats, etc.)
        PushManager.postHandlePush(context, intent);
    }
}

Upvotes: 1

Views: 908

Answers (1)

shader
shader

Reputation: 2121

  1. Remote intent filter from PWBroadcastReceiver, you don't need it.

  2. I don't see any meta tags in your AndroidManifest.xml

You need to add receiver name to meta-data tag to AndroidManifest.xml, otherwise SDK doesn't know where to route push notification.

<receiver android:name=".receivers.PWBroadcastReceiver" />
<meta-data android:name="PW_NOTIFICATION_RECEIVER" android:value=".receivers.PWBroadcastReceiver"/>

UPDATE: Note that the PW_NOTIFICATION_RECEIVER expect package + [path to your notification receiver class].. If you use an application_id (com.myapp.staging) different from original package name (com.myapp), this may cause problem.. and the fix is to use the original package instead of application id

Upvotes: 1

Related Questions