Parse.com 运行时崩溃 - Android

5

我收到了很多用户报告,称我的应用程序崩溃。不断出现的错误似乎与我的parse.com初始化相关,但是,我已按照parse教程中的说明进行设置。

以下是堆栈跟踪:

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:2580)
at android.app.ActivityThread.access$1700(ActivityThread.java:151)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1397)
at android.os.Handler.dispatchMessage(Handler.java:110)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:5292)
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:824)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:640)
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:606)
at com.parse.Parse.getApplicationContext(Parse.java:214)
at com.parse.ManifestInfo.getContext(ManifestInfo.java:322)
at com.parse.ManifestInfo.getPackageManager(ManifestInfo.java:330)
at com.parse.ManifestInfo.getPackageInfo(ManifestInfo.java:356)
at com.parse.ManifestInfo.deviceSupportsGcm(ManifestInfo.java:441)
at com.parse.ManifestInfo.getPushType(ManifestInfo.java:210)
at com.parse.PushService.startServiceIfRequired(PushService.java:168)
at com.parse.ParseBroadcastReceiver.onReceive(ParseBroadcastReceiver.java:19)
at android.app.ActivityThread.handleReceiver(ActivityThread.java:2573)
... 10 more

这是我的初始化代码:

@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_home_screen);
        Parse.initialize(this, "hGG5RdgNVdI7eCeZynV32lWYXywQRHkpp5zLdY7Q", "TwmNbpBYEt4u3euE3lzNIgwyroSl8RPGF2dJFsPv");

        ParseInstallation.getCurrentInstallation().saveInBackground();

请问有谁能看出导致这个错误的原因,并且知道如何修复吗?

以下是我的接收器代码:

public static class Receiver extends ParsePushBroadcastReceiver {
        private String notificationText;
        private Boolean notificationreceived = false;
        public Receiver(){
        }
        private static final String TAG = "MyNotificationsReceiver";

        @Override
        public void onPushOpen(Context context, Intent intent) {
            Log.e("Push", "Clicked");
            Intent i = new Intent(context, HomeScreen.class);
            notificationreceived = true;
            i.putExtra("alert",notificationText);
            i.putExtra("alertreceived", notificationreceived);
            i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            context.startActivity(i);
            Scb998.scb988b=true;

                try {
                    JSONObject json = new JSONObject(intent.getExtras().getString("com.parse.Data"));

                    Scb998.msg = json.getString("alert");


                } catch (JSONException e) {
                    Log.d(TAG, "JSONException: " + e.getMessage());

            }
        }

    }

由于应用上下文为空,导致运行时异常:java.lang.RuntimeException。在使用Parse库之前,您必须调用Parse.initialize(context, applicationId, clientKey)进行初始化。看起来您没有正确地进行初始化。 - Tyler
@Tyler 如果是这种情况,你有没有关于如何正确初始化它的想法呢? - scb998
你可以尝试我的回答,链接在这里:https://dev59.com/C4Xca4cB1Zd3GeqPOuGv#27367613,看看是否有效。 - bjiang
1个回答

9

将您的Parse初始化移动到扩展自ApplicationApp类中。

public class App extends Application {
   @Override
   public void onCreate() {
        super.onCreate();
        Parse.initialize(this, "hGG5RdgNVdI7eCeZynV32lWYXywQRHkpp5zLdY7Q", "TwmNbpBYEt4u3euE3lzNIgwyroSl8RPGF2dJFsPv");
        ParseInstallation.getCurrentInstallation().saveInBackground();
    }
}

当然,还需要在你的AndroidManifest.xml文件中引用它。

<application
    android:name=".app.App"
    ....
</application>

崩溃的原因如下。当您的应用程序在后台时,它可能会被系统杀死。来自Google指南

包含未对用户当前不可见的活动进行处理(活动的onStop()方法已被调用)的进程。这些进程对用户体验没有直接影响,系统可以随时将其终止以回收前台、可见或服务进程的内存。通常有许多后台进程正在运行,因此它们被保存在LRU(最近最少使用)列表中,以确保最近由用户看到的具有活动的进程是最后一个被终止的。如果一个活动正确实现了其生命周期方法,并保存了其当前状态,那么杀死其进程对用户体验没有可见效果,因为当用户导航回该活动时,该活动将恢复其所有可见状态。有关保存和恢复状态的信息,请参见Activities文档。

当您的应用程序接收到推送通知时,解析器将无法初始化,因为您是在活动的onCreate方法中初始化它,而该方法不会被调用。


好的,既然我的布局只有 .java 文件,那么我按照你上面所描述的创建一个新类就可以了吗? - scb998
1
@scb998 是的,你需要创建它。你可以从Parse学习空白项目,看看它是如何构建的。 - gio
现在我已经创建了这两个类,那么我需要从哪里调用它们呢? - scb998
@scb998 要解决你的问题,你需要将 Parse SDK 的初始化从创建活动移动到创建应用程序中。请参考空白项目-->链接<--了解整个过程。 - gio

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接