2012-02-07 4 views
4

PhoneGap과 함께 C2DM을 사용하고 있습니다. C2DM 메시지를 받으면 NotificationManager을 통해 알림을 표시합니다. 사용자가 알림을 선택하면 내 애플리케이션이 의도를 수신합니다. 이 경우 jquery-mobile webapp 내에서 페이지를 활성화하고 싶습니다. Phonegap 및 C2DM - NullPointerException

그러므로 내가 의도 저장할 onNewIntent 이벤트를 오버라이드 : 의도 C2DM에서라면 그런

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

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이지만 왜 그런지는 알지 못합니다.

그래서 질문은 다음과 같습니다

  • 안드로이드 좋은에서 JQuery와 모바일에서 특정 페이지를 선택하는 촬영 방식인가, 아니면 사람이 더 나은 방법을 지적 할 수 있습니까?
  • 예외를 제거하려면 어떻게해야합니까? 물론 beeing null에 대한 pluginManager를 확인할 수 있지만이 경우에는 super를 호출하지 않습니다. 그런 다음 내 특정 페이지가 활성화되지 않습니다.
  • 이것이 PhoneGap 버그라고 생각하십니까? pluginmanager가 null인지 확인하지 않으시겠습니까? 이것이 결코 일어나지 않아야한다고 생각한 PhoneGap 코드를 확인했을 때, onNewIntent는 액티비티가로드 될 때만 호출됩니다. 그렇지 않으면 onCreate가 대신 트리거됩니다.

업데이트 좀 더 지금 알고 : 응용 프로그램을로드하고 C2DM 메시지가 도착하지 않을 경우 문제가 발생합니다. 목적은 이벤트가 다음 순서로 발생, 응용 프로그램을 시작합니다 -하지만 onNewIntent 가끔씩 만 호출됩니다 onNewIntent는이 충돌 시작시에 실행 때마다

onCreate() 
onNewIntent() 
onResume() 

. 나는 onResume - 이벤트의 시작 페이지를 변경하려면 폰갭가 준비되지 않은 경우,이 작동하지 않습니다

@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"); 

그리고 자바 스크립트 onDeviceReady

내가 협상 논리를 사용하는 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에 하나, 페이지 선택을 한 번만 실행되는 것을 보장합니다.