推送通知导致崩溃的解析应用程序

时间:2015-12-16 21:02:30

标签: java android eclipse parse-platform

当应用程序正在运行并打开时,push notification运行完美,但如果在应用程序关闭或未运行时发送推送通知,则应用程序崩溃并且"应用程序X不幸停止"显示。

我粘贴logcat输出以查看错误详细信息,请参阅log cat中的最后一项:

12-14 01:13:25.865: E/AndroidRuntime(25004): FATAL EXCEPTION: main
12-14 01:13:25.865: E/AndroidRuntime(25004): Process: com.ifreedomapp.v3, PID:25004
12-14 01:13:25.865: E/AndroidRuntime(25004): java.lang.RuntimeException: Unable to create service com.parse.PushService: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.Context com.parse.ParsePlugins$Android.applicationContext()' on a null object reference
12-14 01:13:25.865: E/AndroidRuntime(25004): at android.app.ActivityThread.handleCreateService(ActivityThread.java:2887)
12-14 01:13:25.865: E/AndroidRuntime(25004): at android.app.ActivityThread.-wrap4(ActivityThread.java)
12-14 01:13:25.865: E/AndroidRuntime(25004): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1427)
12-14 01:13:25.865: E/AndroidRuntime(25004): at android.os.Handler.dispatchMessage(Handler.java:102)
12-14 01:13:25.865: E/AndroidRuntime(25004): at android.os.Looper.loop(Looper.java:148)
12-14 01:13:25.865: E/AndroidRuntime(25004): at android.app.ActivityThread.main(ActivityThread.java:5417)
12-14 01:13:25.865: E/AndroidRuntime(25004): at java.lang.reflect.Method.invoke(Native Method)
12-14 01:13:25.865: E/AndroidRuntime(25004): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
12-14 01:13:25.865: E/AndroidRuntime(25004): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
12-14 01:13:25.865: E/AndroidRuntime(25004): Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.Context com.parse.ParsePlugins$Android.applicationContext()' on a null object reference
12-14 01:13:25.865: E/AndroidRuntime(25004): at com.parse.PushService.onCreate(PushService.java:230)
12-14 01:13:25.865: E/AndroidRuntime(25004): at android.app.ActivityThread.handleCreateService(ActivityThread.java:2877)
12-14 01:13:25.865: E/AndroidRuntime(25004): ... 8 more
12-14 01:13:50.802: I/Process(25004): Sending signal. PID: 25004 SIG: 9

重现的步骤: (我在我的活动的OnCrete中添加了解析初始化,并按照解析文档中的说明编辑了我的清单)

之后我编译并运行我的应用程序。 1.应用程序已打开,我从解析面板发送推送通知,收到并运行良好。 2.然后我关闭应用程序并进入android主屏幕,然后我从解析面板发送另一个推送通知。 3.通知没有出现,但是" X app不幸停止了#34;被展示。 (X = app name) 4.再次,如果我打开应用程序并从面板发送通知,它会被收到,但如果应用程序关闭或在后台,它不会显示通知,它会崩溃。

Github上的解决方案:

Parse.initialize(Context)应该在您的Application#onCreate()中完成,而不是您的Activity#onCreate(Bundle)根据我们的文档:http://parse.com/docs/android/api/com/parse/Parse.html#initialize(android.content.Context)

由于推送通知会唤醒应用程序,而不是您的活动,这意味着您需要在初始化之前获取解析代码。

我这样做了,我现在尝试将初始化添加到应用程序的OnCreate而不是活动,

但是在运行我的应用程序之后,它没有获得任何推送通知,它只是没有注册设备。

以下是我的代码的一部分:

public class StatusActivity extends
com.MainBase.TabbedActivityBase {

public void onCreate() {
Parse.initialize(this, "", ""); // added my app credentials, removed here
  ParseInstallation.getCurrentInstallation().saveInBackground();
  Parse.enableLocalDatastore(this);
}
public static final String BANNER_FILE_NAME = "bannerImage";

Context mContext;

private ImageView m_banner;


  // private boolean m_tunnelWholeDevicePromptShown = false;

      private InterstitialAd interstitial;  
      ImageView sharebtn;


  public StatusActivity() {
  super();
 m_eventsInterface = new Events();
}

@Override 
protected void onCreate(Bundle savedInstanceState) {

setContentView(R.layout.main);
// m_banner = (ImageView)findViewById(R.id.banner);
m_tabHost = (TabHost) findViewById(R.id.tabHost);
m_toggleButton = (ImageView) findViewById(R.id.toggleButton);
toggleText = (TextView) findViewById(R.id.textViewToggle);
................ further code

任何人都可以帮助我。

GitHub问题:https://github.com/ParsePlatform/Parse-SDK-Android/issues/299

1 个答案:

答案 0 :(得分:0)

试试这个 1.创建一个任何名称的类,例如扩展应用程序的常量

public class Constants extends Application {

    @Override
    public void onCreate() {
        super.onCreate();
        Parse.initialize(this, "", "");
        ParseInstallation.getCurrentInstallation().saveInBackground();
    }
}
  1. 将此类名添加到清单
  2. 中的应用程序标记
    <application
       android:name=".Constants">
    

    并删除活动中解析的所有初始化。