Android 如果由于解析异常而被后退按钮销毁,应用程序会崩溃

Android app crashes if destroyed by back button because of Parse exception

在我的 onCreate() 方法中,我按照文档中的建议初始化了 Parse 库:

// Init Parse and enable Local Datastore.
ParseObject.registerSubclass(AlertObject.class);
Parse.enableLocalDatastore(this);
Parse.initialize(this, getString(R.string.parse_app_id),
            getString(R.string.parse_client_key));

但是,如果我按下后退按钮(因此应用程序停止并销毁),然后通过从上次使用的应用程序菜单中单击它来恢复应用程序,它会崩溃并抛出以下异常:

java.lang.RuntimeException: Unable to start activity ComponentInfo{my.app.pro/my.app.MainActivity}: java.lang.IllegalStateException: `Parse#enableLocalDatastore(Context)` must be invoked before `Parse#initialize(Context)`
[...]

本质上,它建议在 initialize() 之前调用 enableLocalDatastore(),实际上我就是这样做的。

当然,如果我重写 onBackPressed() 方法如下:

@Override
public void onBackPressed() {
    moveTaskToBack(true);
}

应用未被销毁,问题解决。但是,为什么我会在默认行为中得到该异常?

尝试将 Parse 初始化移动到应用程序 class 的 onCreate 方法。如果你没有它,你可以创建一个从 Application 延伸的 class,例如:

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

      ParseObject.registerSubclass(AlertObject.class);
      Parse.enableLocalDatastore(this);
      Parse.initialize(this, getString(R.string.parse_app_id), getString(R.string.parse_client_key));
  }
}

并在 AndroidManifest.xml 文件中写入您正在使用自己的应用程序对象,将 android:name 属性添加到 <application> 标记。示例:

<application
    android:name=".AppApplication"
    >