android Apache Cordova App stürzt nach dem Empfang von Parse.com Push-Benachrichtigung ab



push-notification (2)

Der Parse-Push-Dienst kann nicht gestartet werden, da Parse.initialize noch nicht aufgerufen wurde. Wenn Sie Parse.initialize von einem onCreate einer Aktivität aufrufen, sollte dieser Aufruf stattdessen in dem Application.onCreate sein. Stellen Sie sicher, dass Ihre Anwendungsklasse in Ihrer AndroidManifest.xml mit der Eigenschaft android: name Ihres Tags registriert ist.

Versuchen Sie Activity und Application zu trennen, erstellen Sie eine neue Klassendatei zB MainApplication.

PushApp.java:

public class PushApp extends CordovaActivity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        super.init();
        // Set by <content src="index.html" /> in config.xml
        super.loadUrl(Config.getStartUrl());
        //super.loadUrl("file:///android_asset/www/index.html");
    }
}

Hauptanwendung.java:

public class MainApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        Parse.initialize(this, "xJK9ZA0Dtsjd8RwoNUUsIHPXzMRbmcxXGWqiw", "19g9eUKjLjlUdogHEXStUABNcvy2rA6azb5mXy");
        PushService.setDefaultPushCallback(this, PushApp.class);
        ParseInstallation.getCurrentInstallation().saveInBackground();
    }
}

und ändern:

<activity android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale" android:label="@string/app_name" android:name="PushApp" android:theme="@android:style/Theme.Black.NoTitleBar">

zu:

<activity android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale" android:label="@string/app_name" android:name="MainApplication" android:theme="@android:style/Theme.Black.NoTitleBar">

Jetzt sollten Sie auch Push-Benachrichtigungen erhalten, wenn die App geschlossen wird / der Bildschirm gesperrt ist

Ich möchte den parse.com Push-Benachrichtigungsdienst zu meiner Cordova App hinzufügen. Ich habe gelesen Parse.com Quick Start Guide und ich habe SDK-Datei in den Ordner libs platziert. Danach habe ich die Codes zur Hauptjava-Datei und AndroidManifest.xml hinzugefügt. Die App funktioniert ordnungsgemäß. parse.com kann meinen Geräte-Token empfangen und ich kann Push-Benachrichtigungen an das Gerät senden, aber nach zwei oder drei Push-Benachrichtigungen stürzt die App ab.

Die Fehlermeldung im Catlog ist dies:

05-07 02:08:25.185: E/com.parse.PushService(28735): 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.
05-07 02:08:25.185: D/AndroidRuntime(28735): Shutting down VM
05-07 02:08:25.185: W/dalvikvm(28735): threadid=1: thread exiting with uncaught exception (group=0x41b0de48)
05-07 02:08:25.185: E/AndroidRuntime(28735): FATAL EXCEPTION: main
05-07 02:08:25.185: E/AndroidRuntime(28735): Process: ir.wedesign.pushapp, PID: 28735
05-07 02:08:25.185: E/AndroidRuntime(28735): java.lang.RuntimeException: Unable to start service [email protected] with Intent { act=com.google.android.c2dm.intent.RECEIVE flg=0x10 pkg=ir.wedesign.pushapp cmp=ir.wedesign.pushapp/com.parse.PushService (has extras) }: java.lang.RuntimeException: applicationContext is null. You must call Parse.initialize(context, applicationId, clientKey) before using the Parse library.
05-07 02:08:25.185: E/AndroidRuntime(28735):    at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2726)
05-07 02:08:25.185: E/AndroidRuntime(28735):    at android.app.ActivityThread.access$2100(ActivityThread.java:139)
05-07 02:08:25.185: E/AndroidRuntime(28735):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1297)
05-07 02:08:25.185: E/AndroidRuntime(28735):    at android.os.Handler.dispatchMessage(Handler.java:102)
05-07 02:08:25.185: E/AndroidRuntime(28735):    at android.os.Looper.loop(Looper.java:136)
05-07 02:08:25.185: E/AndroidRuntime(28735):    at android.app.ActivityThread.main(ActivityThread.java:5105)
05-07 02:08:25.185: E/AndroidRuntime(28735):    at java.lang.reflect.Method.invokeNative(Native Method)
05-07 02:08:25.185: E/AndroidRuntime(28735):    at java.lang.reflect.Method.invoke(Method.java:515)
05-07 02:08:25.185: E/AndroidRuntime(28735):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:792)
05-07 02:08:25.185: E/AndroidRuntime(28735):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:608)
05-07 02:08:25.185: E/AndroidRuntime(28735):    at dalvik.system.NativeStart.main(Native Method)
05-07 02:08:25.185: E/AndroidRuntime(28735): Caused by: java.lang.RuntimeException: applicationContext is null. You must call Parse.initialize(context, applicationId, clientKey) before using the Parse library.
05-07 02:08:25.185: E/AndroidRuntime(28735):    at com.parse.Parse.checkContext(Parse.java:557)
05-07 02:08:25.185: E/AndroidRuntime(28735):    at com.parse.Parse.getApplicationContext(Parse.java:165)
05-07 02:08:25.185: E/AndroidRuntime(28735):    at com.parse.ManifestInfo.getContext(ManifestInfo.java:221)
05-07 02:08:25.185: E/AndroidRuntime(28735):    at com.parse.ManifestInfo.getPackageManager(ManifestInfo.java:229)
05-07 02:08:25.185: E/AndroidRuntime(28735):    at com.parse.ManifestInfo.getPackageInfo(ManifestInfo.java:240)
05-07 02:08:25.185: E/AndroidRuntime(28735):    at com.parse.ManifestInfo.deviceSupportsGcm(ManifestInfo.java:325)
05-07 02:08:25.185: E/AndroidRuntime(28735):    at com.parse.ManifestInfo.getPushType(ManifestInfo.java:109)
05-07 02:08:25.185: E/AndroidRuntime(28735):    at com.parse.PushService.onStartCommand(PushService.java:377)
05-07 02:08:25.185: E/AndroidRuntime(28735):    at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2709)
05-07 02:08:25.185: E/AndroidRuntime(28735):    ... 10 more

Das ist meine wichtigste Java-Datei:

/*
       Licensed to the Apache Software Foundation (ASF) under one
       or more contributor license agreements.  See the NOTICE file
       distributed with this work for additional information
       regarding copyright ownership.  The ASF licenses this file
       to you under the Apache License, Version 2.0 (the
       "License"); you may not use this file except in compliance
       with the License.  You may obtain a copy of the License at

         http://www.apache.org/licenses/LICENSE-2.0

       Unless required by applicable law or agreed to in writing,
       software distributed under the License is distributed on an
       "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
       KIND, either express or implied.  See the License for the
       specific language governing permissions and limitations
       under the License.
 */

package ir.wedesign.pushapp;

import android.os.Bundle;
import org.apache.cordova.*;
import com.parse.Parse;
import com.parse.ParseAnalytics;
import com.parse.ParseInstallation;
import com.parse.PushService;

public class PushApp extends CordovaActivity 
{
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        super.init();
        // Set by <content src="index.html" /> in config.xml
        super.loadUrl(Config.getStartUrl());
        //super.loadUrl("file:///android_asset/www/index.html");
        Parse.initialize(this, "xJK9ZA0Dtsjd8RwoNUUsIHPXzMRbmcxXGWqiw", "19g9eUKjLjlUdogHEXStUABNcvy2rA6azb5mXy");
        PushService.setDefaultPushCallback(this, PushApp.class);
        ParseInstallation.getCurrentInstallation().saveInBackground();

    }
}

und meine manifest.xml Datei ist:

<?xml version='1.0' encoding='utf-8'?>
<manifest android:hardwareAccelerated="true" android:versionCode="1" android:versionName="0.0.1" android:windowSoftInputMode="adjustPan" package="ir.wedesign.pushapp" xmlns:android="http://schemas.android.com/apk/res/android">
    <supports-screens android:anyDensity="true" android:largeScreens="true" android:normalScreens="true" android:resizeable="true" android:smallScreens="true" android:xlargeScreens="true" />
    <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" />
    <permission android:protectionLevel="signature"
        android:name="ir.wedesign.pushapp.permission.C2D_MESSAGE" />
    <uses-permission android:name="ir.wedesign.pushapp.permission.C2D_MESSAGE" />

    <application android:hardwareAccelerated="true" android:icon="@drawable/icon" android:label="@string/app_name">   
        <activity android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale" android:label="@string/app_name" android:name="PushApp" android:theme="@android:style/Theme.Black.NoTitleBar">
            <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.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="ir.wedesign.pushapp" />
  </intent-filter>
</receiver>
    </application>
    <uses-sdk android:minSdkVersion="10" android:targetSdkVersion="19" />
</manifest>

Ich habe gesucht und es scheint, dass viele Entwickler genau das gleiche Problem haben. Ich habe zwei Themen im Hilfeforum von parse.com gefunden: https://www.parse.com/questions/app-crashes-after-after-screen-unlock https://www.parse.com/questions/cannot- send-push-to-android-nach-app-is-closed-to-screen-unlock und dieses hier: Android App stürzt ab, wenn Push empfangen und App geschlossen wird

Aber die Lösung ist nicht klar für jemanden, der Java nicht kennt. Wie kann ich meine AndroidManifest.xml- und main-java-Datei ändern, damit sie funktioniert?

Danke im Voraus


Überprüfen Sie Ihre manifest.xml, wenn Sie die <application> als android:name="MainApplication"

und die <activity> als android:name="PushApp"