2014-09-15 3 views
0

알림을 처리하는 서비스가 있습니다. 내가 알림을 클릭하면 내가 액티비티 (NotificationActivity)에 Parcelable 객체를 보내고있다 :NullPointerException : 의도에서 파싱 가능 데이터 가져 오기

서비스 :

Intent destIntent = new Intent (this, NotificationActivity.class); 
destIntent.putExtra ("notificationData", new ParcelableObject (mes)); 

PendingIntent contentIntent = PendingIntent.getActivity (this, 0, destIntent, 0); 

NotificationActivity.java :

public class NotificationActivity extends Activity { 

    @Override 
    protected void onCreate (Bundle savedInstanceState) { 
     super.onCreate (savedInstanceState); 
     setContentView (R.layout.activity_notification); 

     // Always NullPointerException 
     ParcelableObject model = (ParcelableObject) (savedInstanceState.getParcelable ("notificationData")); 

     TextView content = (TextView)findViewById(R.id.content); 
     if (model == null) { 
      content.setText ("NULL"); 
     } else { 
      content.setText (String.valueOf (model.dump())); 
     } 
    } 
} 

하지만 개체를 ​​검색 할 때 NullPointerException이 계속 발생합니다.

편집 :

@Override 
protected void onCreate (Bundle savedInstanceState) { 
    super.onCreate (savedInstanceState); 
    setContentView (R.layout.activity_notification); 
} 

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

    setIntent (intent); 

    // Code not executed here 
    // Needed to move it to onResume() 
    // since according to the doc it comes after onNewIntent() 
} 

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

    ParcelableObject model = (ParcelableObject) (getIntent().getParcelableExtra ("notificationData")); 

    Log.v ("MODEL :: ", model.dump().toString()); // NullPointerException 

    TextView content = (TextView)findViewById(R.id.content); 
    if (model == null) { 
     content.setText ("NULL"); 
    } else { 
     content.setText (String.valueOf (model.dump())); 
    } 
} 

어떤 제안 : 제공된 답변을 따른 후 나는 그런 활동의 코드를 편집 한? 고맙습니다.

답변

2

이 tyczj 한 말에 추가 개체를 얻을 수 getIntent()를 사용해야합니다 :

public class NotificationActivity extends Activity { 

    @Override 
    protected void onCreate (Bundle savedInstanceState) { 
     super.onCreate (savedInstanceState); 
     setContentView (R.layout.activity_notification); 

     // Get from Intent if savedInstanceState is null, otherwise use saved state 
     ParcelableObject model = (ParcelableObject) (savedInstanceState == null ? getIntent().getParcelableExtra("notificationData") : savedInstanceState.getParcelable("notificationData")); 

     TextView content = (TextView)findViewById(R.id.content); 
     if (model == null) content.setText ("NULL"); 
     else content.setText (String.valueOf (model.dump())); 
    } 
} 

그는 위에서 언급 한 바와 같이, 당신의 onSaveInstance/onRestoreInstance이 항상 호출되는 것은 아니기 때문에 이러한 메소드를 사용하는 것이 너무 좋은 아이디어는 아닙니다. 대신 onPause()에 데이터를 저장하고 Activity이 다시 시작될 때 데이터를 복원하는 것이 좋습니다. Activity이 이미 존재하고 방금 새로운 Intent로를 개방하는 경우

또한, 당신은 당신이 새로운 Intent's 데이터를 사용하여 강제로 작업에 onNewInent(Intent)을 우선 확인해야, 다른 새로운 데이터 '수상 접근 가능해야한다. 이렇게하려면, 당신의 onCreate() 방법 다음은이를 추가하십시오 Activity 최신 Intent's 데이터를 사용합니다 있는지 확인합니다

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

합니다.

+0

:) 제 편집을 확인해주세요. 당신이 말한대로 따라 가면서 여전히 NullPointerException을 얻습니다. – Copernic

+1

destIntent .addFlags (Intent.FLAG_ACTIVITY_NEW_TASK); 활동에 대한 의도를 만들 때 새로운 값을 전달하는지 확인하십시오. – Guardanis

+0

당신이 옳았어요! : D는 이미 upvoted,하지만 난 분명히 대답을 받아 들일거야 :) 당신이 문제가 해결 된 이유를 설명해 주시겠습니까? 또한'onNewIntent()'의 코드가'setIntent()'와'onResume()'을 제외하고 실행되지 않는 이유는 무엇입니까? 고맙습니다. – Copernic

1

저장된 인스턴스 상태는 기기가 회전 할 때만 사용되거나 활동이 일시 중지 된 행을 다시 사용한 다음 다시 시작하여 활동을 시작하는 경우 아무 것도하지 않을 경우에만 사용됩니다.

당신은 널 (null)의 여부, 당신은 확인이 뭔가를 시도해야

+0

답변 해 주셔서 감사합니다. 내 편집 된 질문을 확인해 주시겠습니까? 'getIntent()'를 사용했지만 여전히 NullPointerException이 있습니다. – Copernic

+0

@Mehdi 예외가 발생하는 곳을 표시하십시오. – tyczj

+0

'On.V ("MODEL ::", model.dump(). toString()); in OnResume – Copernic

관련 문제