PhoneGap и C2DM - исключение NullPointerException - PullRequest
4 голосов
/ 07 февраля 2012

Я использую C2DM вместе с PhoneGap. Когда я получаю сообщение C2DM, я отображаю уведомление (через NotificationManager). Когда пользователь выбирает уведомление, мое приложение получает намерение. В этом случае я хочу активировать страницу в моем веб-приложении jquery-mobile.

Поэтому я переопределил событие onNewIntent, чтобы сохранить намерение:

@Override
protected void onNewIntent(final Intent intent)
{
    super.onNewIntent(intent);
    setIntent(intent);
}

Затем в onResume я активировал правильную страницу, если намерение было из C2DM:

@Override
protected void onResume()
{
    super.onResume();

    // read possible argument
    boolean showMessage = getIntent().getBooleanExtra(ARG_SHOW_MESSAGES, false);
    if (showMessage)
    {
        clearNotification();
        super.loadUrl("file:///android_asset/www/de/index.html#messages");
    }
}

Это работает нормально, но иногда происходит сбой с NullPointerException - не на моем мобильном телефоне или эмуляторе, а на других устройствах. Трассировка стека говорит, что это onNewIntent действия DroidGap, см. Код :

protected void onNewIntent(Intent intent) {
    super.onNewIntent(intent);

    //Forward to plugins
    this.pluginManager.onNewIntent(intent);
}

Я не смог воспроизвести эту ситуацию. Очевидно, что pluginManager нулевой, но я не знаю почему.

Итак, вопросы:

  • Хорошо ли выбранный подход для выбора определенной страницы в jquery-mobile из Android или кто-то может указать на лучший подход?
  • Как мне избавиться от исключения? Конечно, я мог бы проверить pluginManager на нулевое значение и в этом случае не вызывать super - но тогда моя конкретная страница не активируется.
  • Как вы думаете, это ошибка PhoneGap - не проверять pluginmanager на ноль? Когда я проверял код PhoneGap, я думал, что это никогда не произойдет, в моем понимании onNewIntent вызывается только при загрузке действия, в противном случае onCreate будет запускаться вместо этого.

Обновление Теперь я знаю больше: проблема возникает, когда приложение не загружено и приходит сообщение C2DM. Намерение запускает приложение, события происходят в следующем порядке - но onNewIntent вызывается только изредка:

onCreate()
onNewIntent()
onResume()

При каждом запуске onNewIntent во время запуска происходит сбой. Во всяком случае, я исправил это с помощью:

@Override
protected void onNewIntent(final Intent intent)
{
    // avoid Phonegap bug
    if (pluginManager != null)
    {
        super.onNewIntent(intent);
    }
    setIntent(intent);
}

Когда я хочу изменить стартовую страницу в событии onResume, это не работает, когда Phonegap не готов. Так что просто рано вызывать страницу #messages в onResume в случае запуска приложения. Но когда это назвать? Есть ли возможность подключиться к onDeviceReady?

1 Ответ

1 голос
/ 21 февраля 2012

Я до сих пор не знаю, почему иногда onNewIntent запускается во время запуска приложения (а не только активируется), а иногда нет.В любом случае я решил все свои проблемы с помощью некоторых обходных путей.

В своей деятельности я создал новую функцию (не соответствующие части удалены):

public void onDeviceReady()
{
    if (!isReady)
    {
        super.loadUrl("file:///android_asset/www/en/index.html#messages");
    }

    // activate onResume instead
    isReady = true;
}

и логический флаг выше:

/** Is PhoneGap ready? */
private boolean isReady = false;

Я активирую обратный вызов в событии onCreate:

// Callback setzen
appView.addJavascriptInterface(this, "Android");

и вызываю его из Javascript onDeviceReady

if (OSName == "Android")
{
    window.Android.onDeviceReady();
}

В событии onResume я использую согласованную логику:

protected void onResume()
{
    super.onResume();

    if (isReady)
    {
        super.loadUrl("file:///android_asset/www/en/index.html#messages");
    }
}

Это гарантирует, что выбор страницы выполняется только один раз, либо в onResume, либо в onDeviceReady.

...