PendingIntent는 인 텐트 엑스트라를 보내지 않습니다.


127

MainActicity 시작 RefreshServiceA를 Intent있다 boolean라는 여분 isNextWeek.

내가 RefreshService하게 Notification내 시작하는 MainActivity그것을하면 사용자가 클릭합니다.

이것은 다음과 같습니다.

    Log.d("Refresh", "RefreshService got: isNextWeek: " + String.valueOf(isNextWeek));

    Intent notificationIntent = new Intent(this, MainActivity.class);
    notificationIntent.putExtra(MainActivity.IS_NEXT_WEEK, isNextWeek);

    Log.d("Refresh", "RefreshService put in Intent: isNextWeek: " + String.valueOf(notificationIntent.getBooleanExtra(MainActivity.IS_NEXT_WEEK,false)));
    pendingIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);

    builder = new NotificationCompat.Builder(this).setContentTitle("Title").setContentText("ContentText").setSmallIcon(R.drawable.ic_notification).setContentIntent(pendingIntent);
    notification = builder.build();
    // Hide the notification after its selected
    notification.flags |= Notification.FLAG_AUTO_CANCEL;
    notificationManager.notify(NOTIFICATION_REFRESH, notification);

보시다시피 notificationIntentboolean추가 IS_NEXT_WEEK값이 있어야 isNextWeek합니다 PendingIntent.

지금 클릭하면이 Notification난 항상 얻을 수 false의 값으로isNextWeek

이것이 내가 값을 얻는 방법입니다 MainActivity.

    isNextWeek = getIntent().getBooleanExtra(IS_NEXT_WEEK, false);

로그:

08-04 00:19:32.500  13367-13367/de.MayerhoferSimon.Vertretungsplan D/Refresh: MainActivity sent: isNextWeek: true
08-04 00:19:32.510  13367-13573/de.MayerhoferSimon.Vertretungsplan D/Refresh: RefreshService got: isNextWeek: true
08-04 00:19:32.510  13367-13573/de.MayerhoferSimon.Vertretungsplan D/Refresh: RefreshService put in Intent: isNextWeek: true
08-04 00:19:41.990  13367-13367/de.MayerhoferSimon.Vertretungsplan D/Refresh: MainActivity.onCreate got: isNextWeek: false

내가 직접를 시작하면 MainActivity으로 Intent이 같은 ìsNextValue`과 :

    Intent i = new Intent(this, MainActivity.class);
    i.putExtra(IS_NEXT_WEEK, isNextWeek);
    finish();
    startActivity(i);

모든 것이 제대로 작동하고 내가받을 trueisNextWeek입니다 true.

항상 false가치 가 있다는 사실을 잘못 알고 있습니까?

최신 정보

이것은 문제를 해결합니다 : https://stackoverflow.com/a/18049676/2180161

인용문:

내 의심은 Intent에서 변경되는 유일한 것은 Extras이기 때문에 PendingIntent.getActivity(...)Factory Method는 단순히 이전 의도를 최적화로 재사용하는 것입니다.

RefreshService에서 다음을 시도하십시오.

PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, notificationIntent, PendingIntent.FLAG_CANCEL_CURRENT);

보다:

http://developer.android.com/reference/android/app/PendingIntent.html#FLAG_CANCEL_CURRENT

업데이트 2

사용하는 것이 더 나은 이유는 아래 답변을 참조하십시오 PendingIntent.FLAG_UPDATE_CURRENT.


2
PendingIntent.FLAG_CANCEL_CURRENT는 나를 위해 감사 일
Pelanes

1
많은 시간을 절약했습니다. 정답!
TharakaNirmana 2015

당신은 질문과 해결책이 있습니다 : D 훌륭합니다. 질문에 대한 답으로 추가해야한다고 생각합니다. + 10s가 + 5s보다 낫습니다;)
Muhammed Refaat


내 경우에는 FLAG_UPDATE_CURRENT가 충분하지 않았습니다. 동일한 PendingIntent가 내 위젯에서 재사용 되었기 때문입니다. 드물게 발생하는 작업에 FLAG_ONE_SHOT을 사용하고 위젯 PendingIntent를 그대로 두었습니다.
Eir

답변:


29

비효율적 인 메모리 사용으로 인해 PendingIntent.FLAG_CANCEL_CURRENT를 사용하는 것은 좋은 해결책이 아닙니다. 대신 PendingIntent.FLAG_UPDATE_CURRENT를 사용하십시오 .

Intent.FLAG_ACTIVITY_SINGLE_TOP 도 사용 합니다 (활동이 이미 기록 스택의 맨 위에서 실행중인 경우 실행되지 않음).

Intent resultIntent = new Intent(this, FragmentPagerSupportActivity.class).
                    addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);  
resultIntent.putExtra(FragmentPagerSupportActivity.PAGE_NUMBER_KEY, pageNumber);

PendingIntent resultPendingIntent =
                PendingIntent.getActivity(
                        this,
                        0,
                        resultIntent,
                        PendingIntent.FLAG_UPDATE_CURRENT
                );

그때:

@Override
    protected void onCreate(Bundle savedInstanceState) {
        try {
            super.onCreate(savedInstanceState);

            int startPageNumber;
            if ( savedInstanceState != null)
            {
                startPageNumber = savedInstanceState.getInt(PAGE_NUMBER_KEY);
//so on

이제 작동합니다.


여전히 예상되지 않은 동작이있는 경우 void onNewIntent(Intent intent)이벤트 핸들러 를 구현해보십시오. 그러면 액티비티에 대해 호출 된 새 인 텐트에 액세스 할 수 있습니다 (getIntent () 호출과 같지 않음). 그러면 항상 시작된 첫 번째 인 텐트가 반환됩니다. 당신의 활동.

@Override
protected void onNewIntent(Intent intent) {
    int startPageNumber;

    if (intent != null) {
        startPageNumber = intent.getExtras().getInt(PAGE_NUMBER_KEY);
    } else {
        startPageNumber = 0;
    }
}

21

나는 당신이 당신의 활동 Intent을 재정 의하여 새로운 것을받을 때 업데이트해야한다고 생각합니다 onNewIntent(Intent). 활동에 다음을 추가하십시오.

@Override
public void onNewIntent(Intent newIntent) {
    this.setIntent(newIntent);

    // Now getIntent() returns the updated Intent
    isNextWeek = getIntent().getBooleanExtra(IS_NEXT_WEEK, false);        
}

편집하다:

인 텐트가 수신되었을 때 활동이 이미 시작된 경우에만 필요합니다. 활동이 의도에 의해 시작 (재개되지 않고) 된 경우 문제는 다른 곳에 있으며 내 제안이 문제를 해결하지 못할 수 있습니다.


활동이 닫히고 알림과 함께 열린 경우에도 나타납니다.
maysi

3

다음 코드가 작동합니다.

int icon = R.drawable.icon;
String message = "hello";
long when = System.currentTimeMillis();
NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
Notification notification = new Notification(icon, message, when);

Intent notificationIntent = new Intent(context, MainActivity.class);
notificationIntent.putExtra("isNexWeek", true);
notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
PendingIntent pIntent = PendingIntent.getActivity(context, 0, notificationIntent, 0);
notification.setLatestEventInfo(context, title, message, pIntent);
notification.flags |= Notification.FLAG_AUTO_CANCEL;
notificationManager.notify(0, notification);

MainActivity onCreate에서 :

if (getIntent().getExtras() != null && getIntent().getExtras().containsKey("isNextWeek")) {
        boolean isNextWeek = getIntent().getExtras().getBoolean("isNextWeek");
}

new Notification(icon, message, when);더 이상 사용되지 않습니다
maysi aug.

어쨌든 CLEAR_TOP없이할까요?
Richard
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.