Как отправить параметры из уведомления об уведомлении на мероприятие?

Я могу найти способ отправки параметров в свою активность из моего уведомления.

У меня есть служба, которая создает уведомление. Когда пользователь нажимает на уведомление, я хочу открыть свое основное действие с помощью некоторых специальных параметров. Например, идентификатор элемента, поэтому моя активность может загружать и отображать подробное представление специального элемента. Более конкретно, я загружаю файл, и когда файл загружается, я хочу, чтобы уведомление имело намерение, что при нажатии открывается моя активность в специальном режиме. Я попытался использовать putExtra по своему намерению, но, похоже, не смог его извлечь, поэтому я думаю, что я делаю это неправильно.

Код из моей службы, который создает уведомление:

        // construct the Notification object.
     final Notification notif = new Notification(R.drawable.icon, tickerText, System.currentTimeMillis());


    final RemoteViews contentView = new RemoteViews(context.getPackageName(), R.layout.custom_notification_layout);
    contentView.setImageViewResource(R.id.image, R.drawable.icon);
    contentView.setTextViewText(R.id.text, tickerText);
    contentView.setProgressBar(R.id.progress,100,0, false);
    notif.contentView = contentView;        

    Intent notificationIntent = new Intent(context, Main.class);
    notificationIntent.putExtra("item_id", "1001"); // <-- HERE I PUT THE EXTRA VALUE
    PendingIntent contentIntent = PendingIntent.getActivity(context, 0, notificationIntent, 0);
    notif.contentIntent = contentIntent;

    nm.notify(id, notif);

Код из моей активности, который пытается извлечь дополнительный параметр из уведомления:

 public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.main);


    Bundle extras = getIntent().getExtras();
    if(extras != null){
        Log.i( "dd","Extra:" + extras.getString("item_id") );
    }

Дополнительные параметры всегда равны нулю, и я никогда ничего не получаю в своем журнале.

Btw... onCreate запускается только при запуске моей активности, если моя активность уже запущена, я также хочу собрать дополнительные функции и представить свою активность в соответствии с получаемым item_id.

Любые идеи?

Ответ 1

Взгляните на это руководство (создание уведомления) и на образцы ApiDemos "StatusBarNotifications" и "NotificationDisplay".

Для управления, если действие уже выполняется, вы имеете два способа:

  • Добавьте флаг FLAG_ACTIVITY_SINGLE_TOP в намерение при запуске операции, а затем в классе класса выполните onNewIntent (намерение намерения) обработчик событий, таким образом, вы можете получить доступ к новому намерению, которое было вызвано для активности (что не то же самое, что просто вызвать getIntent(), это всегда будет возвращать первое намерение, которое запустило вашу активность.

  • То же, что и номер один, но вместо добавления флага в Intent вы должны добавить "singleTop" в свою активность AndroidManifest.xml.

Если вы используете дополнительные намерения, помните, чтобы вызвать PendingIntent.getActivity() с флагом PendingIntent.FLAG_UPDATE_CURRENT, в противном случае для каждого уведомления будут повторно использоваться одни и те же дополнительные функции.

Ответ 2

У меня была аналогичная проблема, в моем приложении отображаются уведомления о сообщениях. При наличии нескольких уведомлений и нажатии каждого уведомления он отображает эту информацию уведомления в активности сообщения вида. Я решил, что проблема с такими же дополнительными параметрами получена с учетом намерения сообщения.

Вот код, который исправил это. Код для создания намерения уведомления.

 Intent notificationIntent = new Intent(getApplicationContext(), viewmessage.class);
    notificationIntent.putExtra("NotificationMessage", notificationMessage);
    notificationIntent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP);
    PendingIntent pendingNotificationIntent = PendingIntent.getActivity(getApplicationContext(),notificationIndex,notificationIntent,PendingIntent.FLAG_UPDATE_CURRENT);
    notification.flags |= Notification.FLAG_AUTO_CANCEL;
    notification.setLatestEventInfo(getApplicationContext(), notificationTitle, notificationMessage, pendingNotificationIntent);

Код для просмотра активности сообщений.

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

    onNewIntent(getIntent());
}

@Override
public void onNewIntent(Intent intent){
    Bundle extras = intent.getExtras();
    if(extras != null){
        if(extras.containsKey("NotificationMessage"))
        {
            setContentView(R.layout.viewmain);
            // extract the extra-data in the Notification
            String msg = extras.getString("NotificationMessage");
            txtView = (TextView) findViewById(R.id.txtMessage);
            txtView.setText(msg);
        }
    }


}

Ответ 3

Может быть, немного поздно, но: вместо этого:

public void onNewIntent(Intent intent){
    Bundle extras = intent.getExtras();
    Log.i( "dbg","onNewIntent");

    if(extras != null){
        Log.i( "dbg", "Extra6 bool: "+ extras.containsKey("net.dbg.android.fjol"));
        Log.i( "dbg", "Extra6 val : "+ extras.getString("net.dbg.android.fjol"));

    }
    mTabsController.setActiveTab(TabsController.TAB_DOWNLOADS);
}

Используйте это:

Bundle extras = getIntent().getExtras();
if(extras !=null) {
    String value = extras.getString("keyName");
}

Ответ 4

Общайтесь с тем же вопросом. Я разрешаю его, используя другой код запроса, используя тот же идентификатор, что и уведомление, при создании PendingIntent. но все еще не знаю, почему это должно быть сделано.

PendingIntent contentIntent = PendingIntent.getActivity(context, **id**, notificationIntent, 0);
notif.contentIntent = contentIntent;
nm.notify(**id**, notif);

Ответ 5

После чтения некоторых списков электронной почты и других форумов я обнаружил, что трюк, похоже, добавляет к уникальным данным som.

вот так:

   Intent notificationIntent = new Intent(Main.this, Main.class);
   notificationIntent.putExtra("sport_id", "sport"+id);
   notificationIntent.putExtra("game_url", "gameURL"+id);

   notificationIntent.setData((Uri.parse("foobar://"+SystemClock.elapsedRealtime()))); 

Я не понимаю, зачем это нужно делать. Это связано с тем, что намерение не может быть идентифицировано только его дополнительными функциями...

Ответ 6

Я пробовал все, но ничего не работало.

в конечном итоге придумал следующее решение.

1- в манифесте добавить для активности           андроид: launchMode = "SingleTop"

2- при выполнении ожидающего намерения выполните следующее: используйте пучок вместо прямого использования intent.putString() или intent.putInt()

                    Intent notificationIntent = new Intent(getApplicationContext(), CourseActivity.class);

                    Bundle bundle = new Bundle();
                    bundle.putString(Constants.EXAM_ID,String.valueOf(lectureDownloadStatus.getExamId()));
                    bundle.putInt(Constants.COURSE_ID,(int)lectureDownloadStatus.getCourseId());
                    bundle.putString(Constants.IMAGE_URL,lectureDownloadStatus.getImageUrl());

                    notificationIntent.putExtras(bundle);

                    notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP |
                            Intent.FLAG_ACTIVITY_SINGLE_TOP);
                    PendingIntent contentIntent = PendingIntent.getActivity(getApplicationContext(),
                            new Random().nextInt(), notificationIntent,
                            PendingIntent.FLAG_UPDATE_CURRENT); 

Ответ 7

AndroidManifest.xml

Включить launchMode = "singleTop"

<activity android:name=".MessagesDetailsActivity"
        android:launchMode="singleTop"
        android:excludeFromRecents="true"
        />

SMSReceiver.java

Установите флаги для Intent и PendingIntent

Intent intent = new Intent(context, MessagesDetailsActivity.class);
    intent.putExtra("smsMsg", smsObject.getMsg());
    intent.putExtra("smsAddress", smsObject.getAddress());
    intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP);

    PendingIntent contentIntent = PendingIntent.getActivity(context, notification_id, intent, PendingIntent.FLAG_UPDATE_CURRENT);

MessageDetailsActivity.java

onResume() - вызывается каждый раз, загружает дополнительные функции.

Intent intent = getIntent();
    String extraAddress = intent.getStringExtra("smsAddress");
    String extraBody = intent.getStringExtra("smsMsg");

Надеюсь, что это поможет, он был основан на других ответах здесь, на stackoverflow, но это самый обновленный, который работал у меня.

Ответ 8

Это легко, это мое решение, используя объекты!

Мой POJO

public class Person implements Serializable{

    private String name;
    private int age;

    //get & set

}

Уведомление о методе

  Person person = new Person();
  person.setName("david hackro");
  person.setAge(10);

    Intent notificationIntent = new Intent(this, Person.class);
    notificationIntent.putExtra("person",person);
    notificationIntent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP);

NotificationCompat.Builder builder = new NotificationCompat.Builder(this)
                .setSmallIcon(R.mipmap.notification_icon)
                .setAutoCancel(true)
                .setColor(getResources().getColor(R.color.ColorTipografiaAdeudos))
                .setPriority(2)
                .setLargeIcon(bm)
                .setTicker(fotomulta.getTitle())
                .setContentText(fotomulta.getMessage())
                .setContentIntent(PendingIntent.getActivity(this, 0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT))
                .setWhen(System.currentTimeMillis())
                .setContentTitle(fotomulta.getTicketText())
                .setDefaults(Notification.DEFAULT_ALL);

Новая активность

 private Person person;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_notification_push);
    person = (Person) getIntent().getSerializableExtra("person");
}

Удача!!

Ответ 9

После выполнения поиска я получил решение от руководства разработчика Android.

PendingIntent contentIntent ;
Intent intent = new Intent(this,TestActivity.class);
intent.putExtra("extra","Test");
TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);

stackBuilder.addParentStack(ArticleDetailedActivity.class);

contentIntent = stackBuilder.getPendingIntent(0,PendingIntent.FLAG_UPDATE_CURRENT);

Чтобы получить дополнительное значение в классе Test Activity, вам необходимо написать следующий код:

 Intent intent = getIntent();
 String extra = intent.getStringExtra("extra") ;

Ответ 10

Если вы используете

android:taskAffinity="myApp.widget.notify.activity"
android:excludeFromRecents="true"

в вашем файле AndroidManifest.xml для запуска Activity, вы должны использовать следующее в своих целях:

Intent notificationClick = new Intent(context, NotifyActivity.class);
    Bundle bdl = new Bundle();
    bdl.putSerializable(NotifyActivity.Bundle_myItem, myItem);
    notificationClick.putExtras(bdl);
    notificationClick.setData(Uri.parse(notificationClick.toUri(Intent.URI_INTENT_SCHEME) + myItem.getId()));
    notificationClick.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);  // schließt tasks der app und startet einen seperaten neuen

    TaskStackBuilder stackBuilder = TaskStackBuilder.create(context);
    stackBuilder.addParentStack(NotifyActivity.class);
    stackBuilder.addNextIntent(notificationClick);

    PendingIntent notificationPendingIntent = stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);
    mBuilder.setContentIntent(notificationPendingIntent);

Важно установить уникальные данные, например. используя уникальный идентификатор:

notificationClick.setData(Uri.parse(notificationClick.toUri(Intent.URI_INTENT_SCHEME) + myItem.getId()));

Ответ 11

для служб PendingIntent.FLAG_UPDATE_CURRENT

для меня работа.

Ответ 12

Пожалуйста, используйте как PendingIntent, пока показываете уведомление, чем оно будет разрешено.

PendingIntent intent = PendingIntent.getActivity(это, 0,               notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);

Добавить PendingIntent.FLAG_UPDATE_CURRENT в качестве последнего поля.

Ответ 13

В реализации уведомлений используйте код, подобный следующему:

NotificationCompat.Builder nBuilder = new NotificationCompat.Builder(this, NOTIFICATION_CHANNEL_ID);
...
Intent intent = new Intent(this, ExampleActivity.class);
intent.putExtra("EXTRA_KEY", "value");

PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
nBuilder.setContentIntent(pendingIntent);
...

Чтобы получить Intent дополнительные значения в ExampleActivity, используйте следующий код:

...
Intent intent = getIntent();
if(intent!=null) {
    String extraKey = intent.getStringExtra("EXTRA_KEY");
}
...

ОЧЕНЬ ВАЖНОЕ ПРИМЕЧАНИЕ: метод Intent :: putExtra() перегружен. Чтобы получить дополнительный ключ, вам нужно использовать метод Intent :: get [Type] Extra().

Примечание: NOTIFICATION_ID и NOTIFICATION_CHANNEL_ID являются константами, объявленными в ExampleActivity

Ответ 14

G'day, я тоже могу сказать, что я попробовал все, что упомянуто в этих постах и еще несколько из других. Проблема № 1 для меня заключалась в том, что у нового Intent всегда был нулевой пакет. Моя проблема заключалась в том, чтобы сосредоточиться слишком много на деталях "я включил .this или .that". Мое решение состояло в том, чтобы сделать шаг назад от деталей и посмотреть на общую структуру уведомления. Когда я сделал это, мне удалось разместить ключевые части кода в правильной последовательности. Итак, если у вас возникли похожие проблемы, проверьте:

1. Intent notificationIntent = new Intent(MainActivity.this, NotificationActivity.class);

2a. Bundle bundle = new Bundle();

//Мне нравится указывать тип данных намного лучше. например, bundle.putInt

2b. notificationIntent.putExtras(bundle);
3. PendingIntent contentIntent = PendingIntent.getActivity(MainActivity.this, WIZARD_NOTIFICATION_ID, notificationIntent,
                    PendingIntent.FLAG_UPDATE_CURRENT);
notificationIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
4. NotificationManagerCompat notificationManager = NotificationManagerCompat.from(this);
5.          NotificationCompat.Builder nBuilder =
                    new NotificationCompat.Builder(this)
                            .setSmallIcon(R.drawable.ic_notify)
                            .setContentTitle(title)
                            .setContentText(content)
                            .setContentIntent(contentIntent)
                            .setDefaults(Notification.DEFAULT_SOUND | Notification.DEFAULT_VIBRATE)
                            .setAutoCancel(false)//false is standard. true == automatically removes the notification when the user taps it.
                            .setColor(getResources().getColor(R.color.colorPrimary))
                            .setCategory(Notification.CATEGORY_REMINDER)
                            .setPriority(Notification.PRIORITY_HIGH)
                            .setVisibility(NotificationCompat.VISIBILITY_PUBLIC);
            notificationManager.notify(WIZARD_NOTIFICATION_ID, nBuilder.build());

С этой последовательностью я получаю правильный пакет.