Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/208.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 每次推送获取多个通知_Java_Android_Push Notification_Parse Platform - Fatal编程技术网

Java 每次推送获取多个通知

Java 每次推送获取多个通知,java,android,push-notification,parse-platform,Java,Android,Push Notification,Parse Platform,当我发送推送通知时,设备上会出现5个相同的通知。有什么原因吗?以下是我的application.java和清单: <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.bordengrammar.bordengrammarapp" android:versionCode="1" android:versionName="1" > <!-

当我发送推送通知时,设备上会出现5个相同的通知。有什么原因吗?以下是我的application.java和清单:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.bordengrammar.bordengrammarapp"
    android:versionCode="1"
    android:versionName="1" >

    <!-- OpenGL For Map -->

    <uses-feature
        android:glEsVersion="0x00020000"
        android:required="true" />

    <!-- Permmisions -->

    <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.RECEIVE_BOOT_COMPLETED" />
    <uses-permission android:name="android.permission.VIBRATE" />
    <uses-permission android:name="android.permission.GET_ACCOUNTS" />
    <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.CALL_PHONE" />

    <!-- Maps -->

    <permission
        android:name="com.bordengrammar.bordengrammarapp.permission.MAPS_RECEIVE"
        android:protectionLevel="signature" />

    <uses-permission android:name="com.bordengrammar.bordengrammarapp.permission.MAPS_RECEIVE" />

    <!-- Push notifcation -->

    <permission
        android:name="com.bordengrammar.bordengrammarapp.permission.C2D_MESSAGE"
        android:protectionLevel="signature" />

    <uses-permission android:name="com.bordengrammar.bordengrammarapp.permission.C2D_MESSAGE" />

    <!-- Android 3.0+ -->

    <uses-sdk
        android:minSdkVersion="11"
        android:targetSdkVersion="17" />

    <!-- Main settings for application -->

    <application
        android:name=".Application"
        android:allowBackup="true"
        android:description="@string/des"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/Theme.Example" >

        <!-- Splash screen -->
        <activity
            android:name=".SplashActivity"
            android:label="@string/app_name"
            android:theme="@style/FullBleedTheme" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <!-- Main Activity -->
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
        </activity>

        <!-- Push Stuff -->

        <receiver
            android:name=".BGSWidgetProvider"
            android:icon="@drawable/ic_launcher"
            android:label="BGS Widget" >
            <intent-filter>
                <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />

                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.ALTERNATIVE" />
            </intent-filter>
            <intent-filter>
                <action android:name="com.bordengrammar.bordengrammarapp.BGSWidgetService.MOODY" />
            </intent-filter>

            <meta-data
                android:name="android.appwidget.provider"
                android:resource="@xml/widget_info" />
        </receiver>


        <!-- Other activitys -->

        <activity
            android:name=".AboutActivity"
            android:label="@string/title_activity_about" >
        </activity>
        <activity
            android:name=".SettingsActivity"
            android:label="@string/title_activity_settings" >
        </activity>
        <activity android:name=".LinkActivity"
                  android:label="View Link" >
            <meta-data
                android:name="android.support.PARENT_ACTIVITY"
                android:value="MainActivity" />
        </activity>

        <!-- Meta-data (keys etc) -->

        <meta-data
            android:name="com.google.android.gms.version"
            android:value="@integer/google_play_services_version" />
        <meta-data
            android:name="com.google.android.maps.v2.API_KEY"
            android:value="AIzaSyB7Vi7qBh0Ui0jC5A_cJkeCG2-jB6mQJ0w" />

        <activity
            android:name=".TwitterActivity"
            android:label="@string/title_activity_twitter"
            android:parentActivityName=".MainActivity" >
            <meta-data
                android:name="android.support.PARENT_ACTIVITY"
                android:value="MainActivity" />
        </activity>
        <activity
            android:name=".PrivacyActivity"
            android:label="@string/title_activity_privacy"
            android:parentActivityName=".MainActivity" >
            <meta-data
                android:name="android.support.PARENT_ACTIVITY"
                android:value="MainActivity" />
        </activity>

        <meta-data
            android:name="com.crashlytics.ApiKey"
            android:value="3100c5a6401376fafb134b3000e78233a9a7f693" />

        <!-- For widget -->
        <activity
            android:name=".Licenses"
            android:label="@string/title_activity_licenses"
            android:parentActivityName=".MainActivity" >
            <meta-data
                android:name="android.support.PARENT_ACTIVITY"
                android:value="MainActivity" />
        </activity>








        <!-- Push Service -->
        <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="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" />

                <category android:name="com.bordengrammar.bordengrammarapp" />
            </intent-filter>
        </receiver>
    </application>

</manifest>
公共类应用程序扩展了android.app.Application{

public Application() {
}

@Override
public void onCreate() {
    super.onCreate();
    Parse.setLogLevel(Parse.LOG_LEVEL_VERBOSE);

    // Initialize the Parse SDK.
    Parse.initialize(this, "__REMOVED KEY FOR SECURITY___", "__REMOVED KEY FOR SECURITY___");


    // Specify an Activity to handle all pushes by default.

    PushService.setDefaultPushCallback(this, SplashActivity.class);
    ParseInstallation.getCurrentInstallation().saveInBackground();
}
还有我的舱单:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.bordengrammar.bordengrammarapp"
    android:versionCode="1"
    android:versionName="1" >

    <!-- OpenGL For Map -->

    <uses-feature
        android:glEsVersion="0x00020000"
        android:required="true" />

    <!-- Permmisions -->

    <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.RECEIVE_BOOT_COMPLETED" />
    <uses-permission android:name="android.permission.VIBRATE" />
    <uses-permission android:name="android.permission.GET_ACCOUNTS" />
    <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.CALL_PHONE" />

    <!-- Maps -->

    <permission
        android:name="com.bordengrammar.bordengrammarapp.permission.MAPS_RECEIVE"
        android:protectionLevel="signature" />

    <uses-permission android:name="com.bordengrammar.bordengrammarapp.permission.MAPS_RECEIVE" />

    <!-- Push notifcation -->

    <permission
        android:name="com.bordengrammar.bordengrammarapp.permission.C2D_MESSAGE"
        android:protectionLevel="signature" />

    <uses-permission android:name="com.bordengrammar.bordengrammarapp.permission.C2D_MESSAGE" />

    <!-- Android 3.0+ -->

    <uses-sdk
        android:minSdkVersion="11"
        android:targetSdkVersion="17" />

    <!-- Main settings for application -->

    <application
        android:name=".Application"
        android:allowBackup="true"
        android:description="@string/des"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/Theme.Example" >

        <!-- Splash screen -->
        <activity
            android:name=".SplashActivity"
            android:label="@string/app_name"
            android:theme="@style/FullBleedTheme" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <!-- Main Activity -->
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
        </activity>

        <!-- Push Stuff -->

        <receiver
            android:name=".BGSWidgetProvider"
            android:icon="@drawable/ic_launcher"
            android:label="BGS Widget" >
            <intent-filter>
                <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />

                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.ALTERNATIVE" />
            </intent-filter>
            <intent-filter>
                <action android:name="com.bordengrammar.bordengrammarapp.BGSWidgetService.MOODY" />
            </intent-filter>

            <meta-data
                android:name="android.appwidget.provider"
                android:resource="@xml/widget_info" />
        </receiver>


        <!-- Other activitys -->

        <activity
            android:name=".AboutActivity"
            android:label="@string/title_activity_about" >
        </activity>
        <activity
            android:name=".SettingsActivity"
            android:label="@string/title_activity_settings" >
        </activity>
        <activity android:name=".LinkActivity"
                  android:label="View Link" >
            <meta-data
                android:name="android.support.PARENT_ACTIVITY"
                android:value="MainActivity" />
        </activity>

        <!-- Meta-data (keys etc) -->

        <meta-data
            android:name="com.google.android.gms.version"
            android:value="@integer/google_play_services_version" />
        <meta-data
            android:name="com.google.android.maps.v2.API_KEY"
            android:value="AIzaSyB7Vi7qBh0Ui0jC5A_cJkeCG2-jB6mQJ0w" />

        <activity
            android:name=".TwitterActivity"
            android:label="@string/title_activity_twitter"
            android:parentActivityName=".MainActivity" >
            <meta-data
                android:name="android.support.PARENT_ACTIVITY"
                android:value="MainActivity" />
        </activity>
        <activity
            android:name=".PrivacyActivity"
            android:label="@string/title_activity_privacy"
            android:parentActivityName=".MainActivity" >
            <meta-data
                android:name="android.support.PARENT_ACTIVITY"
                android:value="MainActivity" />
        </activity>

        <meta-data
            android:name="com.crashlytics.ApiKey"
            android:value="3100c5a6401376fafb134b3000e78233a9a7f693" />

        <!-- For widget -->
        <activity
            android:name=".Licenses"
            android:label="@string/title_activity_licenses"
            android:parentActivityName=".MainActivity" >
            <meta-data
                android:name="android.support.PARENT_ACTIVITY"
                android:value="MainActivity" />
        </activity>








        <!-- Push Service -->
        <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="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" />

                <category android:name="com.bordengrammar.bordengrammarapp" />
            </intent-filter>
        </receiver>
    </application>

</manifest>


登录parse.com,转到您的仪表板,检查数据浏览器,在那里您将看到parse安装类的表和数据。似乎您的parse安装表中有相同设备令牌的重复行。您可以运行cron作业来删除重复项,并且只保留上次更新的一个

原因:

这是因为每次在(相同)设备上安装应用程序时,parse都会在“Installation”类中创建一条新记录,因此deviceToken会被复制

解决方案:

您可以通过查找重复条目来解决此问题,并避免在“Installation”类的“beforeSave”函数中插入。最好用javascript编写此部分,然后转到CloudCode。因此,可以减少客户端(android)设备与服务器之间的通信

Parse.Cloud.beforeSave(Parse.Installation, function(request, response) {
    if(!request.object.isNew()) {                       // Old Obj - Updating
        response.success();
    } else {                                            // New Obj - Inserting
        Parse.Cloud.useMasterKey();
        var query = new Parse.Query(Parse.Installation);
        query.equalTo("deviceToken", request.object.get("deviceToken"));
        query.first().then(function(duplicate) {
            if (typeof duplicate === "undefined") {
                console.log("New installation ..");
                response.success();
            } else {
                console.log("Duplicate exist ..");
                response.error();          
            }
        }, function(error) {
            console.warn(error.code + error.message);
            response.error();
        });
    }
});
您可以使用“deviceToken”或自定义字段(如“userID”)来检查重复项,或者根据需要同时使用这两个字段

更新: 在上面的代码中,我刚刚避免了重复条目,但是删除现有条目并插入新条目(如下所示)是一种很好的做法


我也遇到了同样的问题。问题是,当我调用云函数时,“params”参数为null。当我为其设置值时,问题得到了解决。

检查数据浏览器上的安装类,看看是否存在相同的多个设备令牌,以及如何实现这一点@johngomez@epicfinley登录parse.com,转到您的仪表板,并检查数据浏览器,在那里您将看到Parse安装类的表和数据。似乎您的Parse安装表中有相同设备令牌的重复行。您可以运行cron作业删除重复行,并仅保留最后更新的OneHanks@thiyagab将其作为答案发布,我将接受它。@phreakhead您可以在保存之前保存云代码,您可以在其中检查数据是否存在,然后允许添加或跳过我认为此代码将删除更新的安装,而不是旧的安装。是@iturki。正如我在回答中已经提到的,我只是避免了重复插入(新的)。但最好的做法是删除现有的,然后插入新的。Cron Job!!Parse没有Cron jobs。@iturki我指的是后台作业,请参阅此处。问题不在于如何在数据中运行查询。问题在于如何识别数据中的重复项。数据中可能有多行,但不同的开发人员iceTokens,指向同一物理设备。@iturki是的,我们有一种方法可以使用规范ID来处理这个问题,您将如何使用规范ID进行解析?