Android doesn't receive push notification from

2019-04-02 07:02发布

问题:

When I am testing the Parse Push to my Android phones the push notification come through as long as the app runs. If the app is closed: I just get a message saying <App name> has stopped. - I don't receive any of the pushes - but still got the stop notification popup. I have followed the Quickstart guide from Parse step by step.

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="org.ostsia.ostsia">
    <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="org.ostsia.ostsia.permission.C2D_MESSAGE" />
    <uses-permission android:name="org.ostsia.ostsia.permission.C2D_MESSAGE" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ostsia"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="org.ostsia.ostsia.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="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="org.ostsia.ostsia" />
            </intent-filter>
        </receiver>
    </application>
</manifest>

03-03 21:27:10.829  31149-31149/org.ostsia.ostsia E/com.parse.PushService﹕ The Parse push service cannot start because Parse.initialize has not yet been called. If you call Parse.initialize from an Activity's onCreate, that call should instead be in the Application.onCreate. Be sure your Application class is registered in your AndroidManifest.xml with the android:name property of your <application> tag.
03-03 21:27:10.829  31149-31149/org.ostsia.ostsia D/AndroidRuntime﹕ Shutting down VM
03-03 21:27:10.839  31149-31149/org.ostsia.ostsia E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: org.ostsia.ostsia, PID: 31149
    java.lang.RuntimeException: Unable to start service com.parse.PushService@4d17bf6 with Intent { act=com.google.android.c2dm.intent.RECEIVE flg=0x10 pkg=org.ostsia.ostsia cmp=org.ostsia.ostsia/com.parse.PushService (has extras) }: java.lang.RuntimeException: applicationContext is null. You must call Parse.initialize(context, applicationId, clientKey) before using the Parse library.
            at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:3278)
            at android.app.ActivityThread.access$2200(ActivityThread.java:172)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1520)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:145)
            at android.app.ActivityThread.main(ActivityThread.java:5834)
            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:1388)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1183)
     Caused by: java.lang.RuntimeException: applicationContext is null. You must call Parse.initialize(context, applicationId, clientKey) before using the Parse library.
            at com.parse.Parse.checkContext(Parse.java:451)
            at com.parse.Parse.getApplicationContext(Parse.java:219)
            at com.parse.ManifestInfo.getContext(ManifestInfo.java:322)
            at com.parse.ManifestInfo.getPackageName(ManifestInfo.java:326)
            at com.parse.ManifestInfo.getIntentReceivers(ManifestInfo.java:131)
            at com.parse.ManifestInfo.hasIntentReceiver(ManifestInfo.java:123)
            at com.parse.ManifestInfo.getPushUsesBroadcastReceivers(ManifestInfo.java:174)
            at com.parse.PushService.wipeRoutingAndUpgradePushStateIfNeeded(PushService.java:454)
            at com.parse.PushService.onStartCommand(PushService.java:435)
            at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:3261)
            at android.app.ActivityThread.access$2200(ActivityThread.java:172)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1520)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:145)
            at android.app.ActivityThread.main(ActivityThread.java:5834)
            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:1388)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1183)
03-03 21:27:12.599  31149-31149/org.ostsia.ostsia I/Process﹕ Sending signal. PID: 31149 SIG: 9

回答1:

Have the parse initialized in Application class similar as below

public class AppClass extends Application {
    @Override
    public void onCreate() {
        super.onCreate();

        // Parse.enableLocalDatastore(this); // if you need this, put before init
        Parse.initialize(this, "gV6QK", "JJmFo99");
        PushService.setDefaultPushCallback(getApplicationContext(), MainActivity.class);
        ParseInstallation.getCurrentInstallation().saveInBackground();
    }
}

Don't forget to reference your app class in manifest

<application android:name=".AppClass">

Remove Parse init from MainActivity



回答2:

Sorry - I don't know to use the right function for implement code to Stack - please say so if you have a better way.

I still got the "You must call Parse.initialize(context, applicationId, clientKey) before using the Parse library." error. Now i can't reccive notifications even when the app is open. I have splitted the Parse Push to another class. Under is my source code.

MainActivity

package org.ostsia.ostsia;

import android.app.Activity;
import android.app.Application;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.view.KeyEvent;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.content.Intent;
import android.net.Uri;


/*
 * Demo of creating an application to open any URL inside the application and clicking on any link from that URl
should not open Native browser but  that URL should open in the same screen.
 */

public class MainActivity extends Activity {
    /** Called when the activity is first created. */


    WebView web;


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        web = (WebView) findViewById(R.id.webview01);
        web.setWebViewClient(new myWebClient());
        web.getSettings().setJavaScriptEnabled(true);
        web.loadUrl("http://tconsulting.no/ostsia");
    }



    public class myWebClient extends WebViewClient
    {
        @Override
        public void onPageStarted(WebView view, String url, Bitmap favicon) {
            // TODO Auto-generated method stub
            super.onPageStarted(view, url, favicon);
        }

        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            if( url.startsWith("http:") || url.startsWith("https:") ) {
                return false;
            }

            // Otherwise allow the OS to handle it
            else if (url.startsWith("tel:")) {
                Intent tel = new Intent(Intent.ACTION_DIAL, Uri.parse(url));
                startActivity(tel);
                return true;
            }
            else if (url.startsWith("mailto:")) {
                String body = "Enter your Question, Enquiry or Feedback below:\n\n";
                Intent mail = new Intent(Intent.ACTION_SEND);
                mail.setType("application/octet-stream");
                mail.putExtra(Intent.EXTRA_EMAIL, new String[]{"email address"});
                mail.putExtra(Intent.EXTRA_SUBJECT, "Subject");
                mail.putExtra(Intent.EXTRA_TEXT, body);
                startActivity(mail);
                return true;
            }
            return true;
        }
    }

    // To handle "Back" key press event for WebView to go back to previous screen.
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event)
    {
        if ((keyCode == KeyEvent.KEYCODE_BACK) && web.canGoBack()) {
            web.goBack();
            return true;
        }
        return super.onKeyDown(keyCode, event);
    }
}

AppClass

package org.ostsia.ostsia;


import android.app.Application;


import org.ostsia.ostsia.MainActivity;
import com.parse.Parse;
import com.parse.ParseInstallation;
import com.parse.ParsePush;

public class AppClass extends Application {
    @Override
    public void onCreate() {
        super.onCreate();

        Parse.initialize(this, "XXX", "XX");
        // Parse.setDefaultPushCallback(getApplicationContext(), MainActivity.java);
        ParseInstallation.getCurrentInstallation().saveInBackground();
    }

}

Manifest file

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="org.ostsia.ostsia">
    <application android:name=".AppClass"/>
    <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="org.ostsia.ostsia.permission.C2D_MESSAGE" />
    <uses-permission android:name="org.ostsia.ostsia.permission.C2D_MESSAGE" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ostsia"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="org.ostsia.ostsia.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="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="org.ostsia.ostsia" />
            </intent-filter>
        </receiver>
    </application>
</manifest>