Очікуючий намір не надсилає додаткові наміри


127

Моє MainActicity починається RefreshServiceз 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);

Як ви бачите, notificationIntentповинні бути booleanдодаткові, 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);

все працює добре, і я отримую, trueколи isNextWeekє true.

Що я помиляюсь, що завжди є falseцінність?

ОНОВЛЕННЯ

це вирішує проблему: https://stackoverflow.com/a/18049676/2180161

Цитата:

Я підозрюю, що, оскільки єдине, що змінюється в Намір, - це додаткові засоби, PendingIntent.getActivity(...)фабричний метод - це просто повторне використання старого наміру в якості оптимізації.

У 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

у вас є питання і рішення: D чудово. Я думаю, ви повинні додати це як відповідь на запитання. + 10s краще, ніж + 5s;)
Мухаммед Refaat

Звернення до цього рішення: stackoverflow.com/questions/1198558 / ...
M.Noman

FLAG_UPDATE_CURRENT в моєму випадку недостатньо, оскільки той самий PendingIntent був повторно використаний моїм віджетом. Я в кінцевому підсумку використовував FLAG_ONE_SHOT для дії, яка трапляється рідко, і залишив віджет PendingIntent недоторканим.
Еїр

Відповіді:


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);        
}

Редагувати:

Це потрібно лише в тому випадку, якщо ваша активність уже розпочата, коли наміри отримані. Якщо ваша діяльність розпочата (а не просто відновлена) з наміром, то проблема в іншому місці, і моя пропозиція може не вирішити її.


це також з’являється, якщо діяльність закрита і після цього відкривається з повідомленням.
майсі

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);застаріло
майсі

У будь-якому разі це зробити без CLEAR_TOP?
Річард
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.