Я использую 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?