2012-02-07 2 views
4

PhoneGapと一緒にC2DMを使用しています。 C2DMメッセージを受信すると、通知が表示されます(NotificationManager経由)。ユーザーが通知を選択すると、アプリケーションはインテントを受信します。その場合、jquery-mobile webapp内のページをアクティブにしたいと思います。PhonegapとC2DM - NullPointerException

ので、私は意図を保存するためにonNewIntentイベントをオーバーライド:、その後

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

意図はC2DMからだった場合onResumeに、私は正しいページをアクティブ化:

@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が発生してクラッシュすることがあります。スタックトレースはCodeを参照してください、それはDroidGap活動のonNewIntentであると言う:

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

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

私はこのような状況を再現することができませんでした。明らかにpluginManagerはnullですが、なぜそうはしません。

だから、質問は以下のとおりです。

  • は、Android良いからjqueryの、モバイルで特定のページを選択するために取られたアプローチですか誰かがより良いアプローチを指摘することができますか?
  • 例外を取り除くにはどうすればよいですか?もちろん、私はpluginManagerをbeeing nullにチェックすることができます。この場合はsuperを呼び出さないでください。しかし、私の特定のページはアクティブ化されません。
  • これはPhoneGapのバグだと思いますか?pluginmanagerでnullをチェックしないでください。私はPhoneGapコードをチェックしたとき、これは決して起こらないはずだと私は考えていました。onNewIntentはアクティビティが読み込まれたときにのみ呼び出されます。そうでなければonCreateがトリガーされます。

更新 私はもっと今知っている:アプリケーションがロードされていないときに問題が発生し、C2DMメッセージが到着しました。 意図は、イベントが次の順序で発生し、アプリを起動します - しかしonNewIntentはたまにしか呼び出されます。onNewIntentは、それがクラッシュし、起動時に実行されるたびに

onCreate() 
onNewIntent() 
onResume() 

。私はonResume-イベントにスタートページを変更したい場合はPhoneGapの準備ができていないとき、これは動作しません

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

:とにかく私はこれを修正しました。したがって、アプリケーションが起動している場合は、onResumeの#messagesページを呼び出すのは早い時期です。しかしそれをいつ呼び出すのですか? onDeviceReadyに接続する可能性はありますか?

答えて

1

なぜアプリケーションが起動する(起動されただけではない)時にはonNewIntentがトリガされるのはなぜか分かりません。とにかく私はいくつかの回避策を使ってすべての問題を解決しました。私はのonCreateイベントでコールバックをアクティブに

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

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

    // activate onResume instead 
    isReady = true; 
} 

以上ブールフラグ:私の活動で

は、私は新しい機能(関連する部分が取り除かれていない)を作成し

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

とし、Javascript onDeviceReady

0123私が交渉のロジックを使用しonResumeイベントで
if (OSName == "Android") 
{ 
    window.Android.onDeviceReady(); 
} 

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

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

これは、ページの選択はonResumeまたはonDeviceReadyのいずれかで、一度だけ実行されることを保証します。