Parse SDK在android中为推送通知实现自定义BroadcastReceiver

rah*_*ver 0 android parse-platform

我试图在Android上开始使用Parse推送通知,但我找不到任何方法来实现我自己的BroadcastReceiver,它会执行响应推送通知的操作.

在他们的"入门"中,他们给出了一个程序示例,其中接收器和intent服务包含在jar文件中(并且未在代码中实现,因此我可以尝试使用它).这里也提出类似的问题,但它已经两年了,答案有11个问题.

还有一些其他的博客文章,例如在这里,但没有一个正常工作(该链接中的一个是两年).

所以请建议一步一步地实施同样的方法.

编辑:

我按照droidx的建议尝试了代码.但它不起作用.我正在发送我的AndroidManifest.xml(其余代码完全按照他的建议):

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.rahulserver.parsenotificationdemo" >
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="android.permission.VIBRATE" />
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
    <uses-permission android:name="android.permission.GET_ACCOUNTS" />
    <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />

    <!--
      IMPORTANT: Change "com.parse.starter.permission.C2D_MESSAGE" in the lines below
      to match your app's package name + ".permission.C2D_MESSAGE".
    -->
    <permission android:protectionLevel="signature"
        android:name="com.rahulserver.parsenotificationdemo.permission.C2D_MESSAGE" />
    <uses-permission android:name="com.rahulserver.parsenotificationdemo.permission.C2D_MESSAGE" />
    <application
        android:name=".ParseNotification"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <service android:name="com.parse.PushService" />
        <receiver android:name="com.parse.ParseBroadcastReceiver">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
                <action android:name="android.intent.action.USER_PRESENT" />
            </intent-filter>
        </receiver>
        <receiver android:name=".MyCustomParsePushReceiver"
            android:exported="false">
            <intent-filter>
                <action android:name="com.parse.push.intent.RECEIVE" />
                <action android:name="com.parse.push.intent.DELETE" />
                <action android:name="com.parse.push.intent.OPEN" />
            </intent-filter>
        </receiver>
        <receiver android:name="com.parse.GcmBroadcastReceiver"
            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" />

                <!--
                  IMPORTANT: Change "com.parse.starter" to match your app's package name.
                -->
                <category android:name="com.rahulserver.parsenotificationdemo" />
            </intent-filter>
        </receiver>
    </application>

</manifest>
Run Code Online (Sandbox Code Playgroud)

dro*_*idx 6

这是一个例子!

public class ParseCustomBroadcastReceiver extends ParsePushBroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        try {

            JSONObject json = new JSONObject(intent.getExtras().getString("com.parse.Data"));
            Log.d(TAG, json.getString("alert").toString());

            final String notificationTitle = json.getString("title").toString();
            final String notificationContent = json.getString("alert").toString();
            final String uri = json.getString("uri");             

            Intent resultIntent = null;
            TaskStackBuilder stackBuilder = TaskStackBuilder.create(context);


                resultIntent = new Intent(context, HomeScreen.class);
                stackBuilder.addParentStack(HomeScreen.class);

            stackBuilder.addNextIntent(resultIntent);
            PendingIntent resultPendingIntent =
                    stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);


//Customize your notification - sample code
            NotificationCompat.Builder builder =
                    new NotificationCompat.Builder(context)
                            .setSmallIcon(R.mipmap.ic_notification_icon)
                            .setContentTitle(notificationTitle)
                            .setContentText(notificationContent);

            int mNotificationId = 001;
            NotificationManager mNotifyMgr =
                    (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
            mNotifyMgr.notify(mNotificationId, builder.build());


        } catch (JSONException e) {
            Log.d(TAG, e.getMessage());
        }

    }
}
Run Code Online (Sandbox Code Playgroud)

按照指南,将接收器的android名称替换为自定义广播接收器的路径

<receiver
            android:name=".receivers.ParseCustomBroadcastReceiver"
            android:exported="false" >
            <intent-filter>
                <action android:name="com.parse.push.intent.RECEIVE" />
                <action android:name="com.parse.push.intent.DELETE" />
                <action android:name="com.parse.push.intent.OPEN" />
            </intent-filter>
        </receiver>
Run Code Online (Sandbox Code Playgroud)

在您的应用程序类中,请确保已按此订阅Parse Push

Parse.initialize(this, ParseUtils.PARSE_APPLICATION_ID_DEV, ParseUtils.PARSE_CLIENT_KEY_DEV);
        ParseObject.registerSubclass(Article.class);

        ParsePush.subscribeInBackground("", new SaveCallback() {
            @Override
            public void done(ParseException e) {
                if (e == null) {
                    Log.d(TAG, "successfully subscribed to the broadcast channel.");
                } else {
                    Log.e(TAG, "failed to subscribe for push", e);
                }
            }
        });
Run Code Online (Sandbox Code Playgroud)

更新:

上述广播接收器希望从解析仪表板发送一个json对象通知,通常由三个名称值对组成:

{ "alert": "Alert message", "title": "Title", "uri": "bla bla" } 
Run Code Online (Sandbox Code Playgroud)

当你只使用普通字符串时,例如:hello world!在解析推送仪表板,内部它只作为警报标签.这样的事情:{"alert" : "hello world!, "title" = null/"", "uri" = null/""}

上面的广播接收器代码没有这个空检查,所以它被捕获到异常没有title/uri的catch.

因此,您可以根据推送通知的期望添加一些空检查.

像这样的东西:

JSONObject json = new JSONObject(intent.getExtras().getString("com.parse.Data"));
            Log.d(TAG, json.getString("alert").toString());

            if (json.has("title")) {
                 notificationTitle = json.getString("title").toString();
            }
            if (json.has("alert")) {
                 notificationAlert = json.getString("alert").toString();
            }

            if(json.has("uri")) {
                notificationURI = json.getString("uri");
            }
Run Code Online (Sandbox Code Playgroud)

然后设置适当的contentTitle,并contentText在通知

 NotificationCompat.Builder builder =
                    new NotificationCompat.Builder(context)
                            .setSmallIcon(R.mipmap.ic_launcher)
                            .setContentTitle(notificationAlert)
                            .setContentText(notificationAlert);
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助!

通知示例 - 纯字符串

  • 我试过,它对我有用.我已经分叉你的代码并将其修改为有效.这里 - https://www.dropbox.com/sh/2sn3p3i5gtpsym8/AABZPc78aDJh0U5FOnn8oIyfa?dl=0 (2认同)