【问题标题】:Unexpectedly Closed Application After Integration Parse.com集成后意外关闭应用程序 Parse.com
【发布时间】:2014-09-22 17:31:48
【问题描述】:

运行我的小 android 应用程序时没有问题。我集成了我的应用程序新功能。我正在通过 www.parse.com 使用准备好的脚本来使用实时推送通知。运行时没有问题,但是当我关闭屏幕并重新打开时。出现错误。您的应用程序意外关闭。我不知道为什么,也没有日志。

我在 oncreate 之前的主要活动中使用此代码

Parse.initialize(this, "XXX", "YYY");
PushService.setDefaultPushCallback(this, MainActivity.class);
ParseInstallation.getCurrentInstallation().saveInBackground();
ParseAnalytics.trackAppOpened(getIntent());

AndroidManifest.xml

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.islamiceducationquestions.v1"
    android:versionCode="13"
    android:versionName="8.0.1">

    <uses-sdk android:minSdkVersion="14" android:targetSdkVersion="17" />
<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.islamiceducationquestions.v1.permission.C2D_MESSAGE" />

<uses-permission android:name="com.islamiceducationquestions.v1.permission.C2D_MESSAGE" />
    <application
        android:label="@string/app_name"
        android:icon="@drawable/ic_launcher"
        android:theme="@android:style/Theme.Holo.Light.DarkActionBar">

        <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="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.islamiceducationquestions.v1" />
  </intent-filter>
</receiver>
    </application>

</manifest>

日志是:

java.lang.RuntimeException: Unable to start receiver com.parse.ParseBroadcastReceiver: java.lang.RuntimeException: applicationContext is null. You must call Parse.initialize(context, applicationId, clientKey) before using the Parse library.
at android.app.ActivityThread.handleReceiver(ActivityThread.java:2844)
at android.app.ActivityThread.access$1700(ActivityThread.java:156)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1440)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:157)
at android.app.ActivityThread.main(ActivityThread.java:5867)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:674)
at dalvik.system.NativeStart.main(Native Method)
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:583)
at com.parse.Parse.getApplicationContext(Parse.java:191)
at com.parse.ManifestInfo.getContext(ManifestInfo.java:241)
at com.parse.ManifestInfo.getPackageManager(ManifestInfo.java:249)
at com.parse.ManifestInfo.getPackageInfo(ManifestInfo.java:272)
at com.parse.ManifestInfo.deviceSupportsGcm(ManifestInfo.java:357)
at com.parse.ManifestInfo.getPushType(ManifestInfo.java:129)
at com.parse.PushService.startServiceIfRequired(PushService.java:150)
at com.parse.ParseBroadcastReceiver.onReceive(ParseBroadcastReceiver.java:19)
at android.app.ActivityThread.handleReceiver(ActivityThread.java:2833)
... 10 more

【问题讨论】:

  • “oncreate 之前”究竟是什么意思?
  • super.onCreate(savedInstanceState);

标签: android permissions parse-platform push


【解决方案1】:

正如您在Android Parse.com Simple ListView Tutorial 看到的,您需要从应用程序的 onCreate 而不是从 Activity 或服务调用 Parse.initialize。这样做:

public class ParseApplication extends Application {

    @Override
    public void onCreate() {
        super.onCreate();

        // Add your initialization code here
        Parse.initialize(this, YOUR_APPLICATION_ID, YOUR_CLIENT_KEY);

    }

}

同时在AndroidManifest.xml 中添加ParseApplication 作为应用程序标签名称:

 <application
        android:label="@string/app_name"
        android:icon="@drawable/ic_launcher"
        android:name="ParseApplication" 
        ....

【讨论】:

  • 如果我这样使用:上传此apk时出现错误; 必须只有一个应用程序
  • @Mgnfcnt : 不要在AndroidManifest.xml 中添加新的应用程序标签,只需在当前应用程序标签中添加android:name="ParseApplication"
  • @Mgnfcnt :确保您已从 Activity 中删除 Parse.initialize(this, "XXX", "YYY");
  • 是的;我删除并删除了未使用的导入
  • @Mgnfcnt:请查看回答中提到的教程,可能会帮助您解决问题。
猜你喜欢
  • 1970-01-01
  • 2014-11-02
  • 1970-01-01
  • 1970-01-01
  • 2013-04-03
  • 1970-01-01
  • 1970-01-01
  • 2021-08-18
  • 2013-12-01
相关资源
最近更新 更多