简体   繁体   English

Parse.com推送通知不会到达后台设备

[英]Parse.com push notifications don't get to devices on background

Today I've implemented Parse.com Push service in my app. 今天,我已经在我的应用程序中实现了Parse.com Push服务。 I've noticed that the push notifications are being sent only when the app is open. 我注意到只有在应用打开时才发送推送通知。 I've also noticed that whenever I'm turning on my device there is a message says "Unfortunately, tof has stopped". 我还注意到,每当我打开设备电源时,都会显示一条消息,“不幸的是,tof已停止”。 The Logcat says Unable to start receiver. Logcat说无法启动接收器。

The full Logcat: 完整的Logcat:

java.lang.RuntimeException: Unable to start receiver com.parse.ParseBroadcastReceiver: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.Context com.parse.ParsePlugins$Android.applicationContext()' on a null object reference
        at android.app.ActivityThread.handleReceiver(ActivityThread.java:2952)
        at android.app.ActivityThread.access$1800(ActivityThread.java:172)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1499)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:145)
        at android.app.ActivityThread.main(ActivityThread.java:5832)
        at java.lang.reflect.Method.invoke(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:372)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1399)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1194)
 Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.Context com.parse.ParsePlugins$Android.applicationContext()' on a null object reference
        at com.parse.Parse.checkContext(Parse.java:440)
        at com.parse.Parse.getApplicationContext(Parse.java:270)
        at com.parse.ManifestInfo.getContext(ManifestInfo.java:324)
        at com.parse.ManifestInfo.getPackageManager(ManifestInfo.java:328)
        at com.parse.ManifestInfo.getPackageInfo(ManifestInfo.java:358)
        at com.parse.ManifestInfo.deviceSupportsGcm(ManifestInfo.java:446)
        at com.parse.ManifestInfo.getPushType(ManifestInfo.java:212)
        at com.parse.PushService.startServiceIfRequired(PushService.java:222)
        at com.parse.ParseBroadcastReceiver.onReceive(ParseBroadcastReceiver.java:19)
        at android.app.ActivityThread.handleReceiver(ActivityThread.java:2945)
        at android.app.ActivityThread.access$1800(ActivityThread.java:172)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1499)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:145)
        at android.app.ActivityThread.main(ActivityThread.java:5832)
        at java.lang.reflect.Method.invoke(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:372)

I've tried to search on the Web but I didn't find any solution. 我试图在Web上搜索,但没有找到任何解决方案。 I guess that it's something about the receiver background operation. 我想这与接收器后台操作有关。

I need an answer as quickly as possible, so if you know a bit about Parse SDK and it's push topic so please, help me 'cause I need to solve this today . 我需要尽快回答,因此,如果您对Parse SDK有所了解,并且是推送主题,那么请帮我,因为我今天需要解决此问题

This is my code. 这是我的代码。
MainActivity.java: MainActivity.java:

ParsePush parsePush = new ParsePush();
ParseQuery pQuery = ParseInstallation.getQuery(); // <-- Installation query
pQuery.whereEqualTo("username", User_Name); 
parsePush.sendMessageInBackground(message, pQuery);

AndroidManifest.xml: AndroidManifest.xml:

<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.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.intap.tof.permission.C2D_MESSAGE" />
<uses-permission android:name="com.intap.tof.permission.C2D_MESSAGE" />

...

<service android:name="com.parse.PushService" />
    <receiver android:name="com.intap.tof.Receiver"
        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.intap.tof" />
        </intent-filter>
    </receiver>

I also have this line on Receiver.java: 我在Receiver.java上也有这行:

package com.intap.tof;

import android.content.Context;
import android.content.Intent;

import com.parse.ParsePushBroadcastReceiver;

public class Receiver extends ParsePushBroadcastReceiver {

    @Override
    public void onPushOpen(Context context, Intent intent) {
        Intent i = new Intent(context, MainActivity.class);
        i.putExtras(intent.getExtras());
        i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startActivity(i);
    }
}

I need major help right now!! 我现在需要重大帮助!! Please help me! 请帮我!

Follow the steps below. 请按照以下步骤操作。 This code works fine and run the receiver on background. 此代码可以正常运行,并在后台运行接收器。 The original answer link: https://www.parse.com/apps/quickstart#parse_push/android/native/existing 原始答案链接: https : //www.parse.com/apps/quickstart#parse_push/android/native/existing

MainActivity.java file MainActivity.java文件

public void onCreate() {
  Parse.initialize(this, "APPLICATION ID", "CLIENT KEY");
  ParseInstallation.getCurrentInstallation().saveInBackground();
}

AndroidManifest.xml file AndroidManifest.xml文件

<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.ParsePushBroadcastReceiver"
    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.parse.starter" />
  </intent-filter>
</receiver>

Permissions. 权限。

<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.parse.starter.permission.C2D_MESSAGE" />
<uses-permission android:name="com.parse.starter.permission.C2D_MESSAGE" />

Have a look at this. 看看这个。

public class MainApplication extends Application {
    private static MainApplication instance = new MainApplication();

    public MainApplication() {
        instance = this;
    }

    public static Context getContext() {
        return instance;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        Parse.initialize(this, " ", " ");
        PushService.setDefaultPushCallback(this, FabulaClient.class);
        PushService.subscribe(this, "Barca", FabulaClient.class);
        ParseInstallation.getCurrentInstallation().saveInBackground();
    }
}

taken from https://www.parse.com/questions/cannot-send-push-to-android-after-app-is-closed-until-screen-unlock 取自https://www.parse.com/questions/cannot-send-push-to-android-after-app-is-closed-until-screen-unlock

I've understood why I don't get the push notifications on background. 我了解了为什么我没有在后台收到推送通知。

I've initialized parse sdk twice - on the OpenActivity.java and on ParseApplication.java . 我已经在OpenActivity.javaParseApplication.java上初始化了两次解析sdk的ParseApplication.java I've removed it from the OpenActivity.java and added this code line: 我已经从OpenActivity.java其删除,并添加了以下代码行:

android:name=".ParseApplication"

To the application attribute on the AndroidManifest.xml and now I can get push notifications on background. 现在转到AndroidManifest.xml上的application属性,现在我可以在后台获取推送通知。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM