Frage

Ich kann einen Weg finden, Parameter zu meiner Tätigkeit von meiner Mitteilung zu senden.

Ich habe einen Dienst, der eine Meldung erzeugt. Wenn der Benutzer klickt auf die Meldung möchte ich meine Haupttätigkeit mit einigen speziellen Parameter öffnen. Z. B eine Element-ID, so dass meine Tätigkeit kann eine spezielle Element Detailansicht laden und präsentieren. Genauer gesagt, ich bin das Herunterladen einer Datei, und wenn die Datei heruntergeladen wird, ich möchte, dass die Meldung eine Absicht haben, dass, wenn angeklickt haben meine Tätigkeit in einem speziellen Modus öffnet. Ich habe auf meine Absicht zu verwenden putExtra versucht, aber kann nicht scheinen, um sie zu extrahieren, so dass ich denke, ich tue es falsch.

-Code von meinem Dienst, der die Meldung erzeugt:

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

-Code aus meiner Tätigkeit, die versucht, die zusätzlichen Parameter aus der Meldung zu holen:

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

Die Extras sind immer null und ich bekommt nie etwas in mein Logbuch.

Btw ... die onCreate nur ausgeführt, wenn meine Tätigkeit beginnt, wenn meine Tätigkeit bereits begonnen Ich mag auch die Extras sammeln und meine Tätigkeit präsentiert nach dem ITEM_ID I erhalten.

Irgendwelche Ideen?

War es hilfreich?

Lösung

Werfen Sie einen Blick auf diese Führung ( Erstellen einer Benachrichtigung ) und zu den Proben ApiDemos "StatusBarNotifications" und "NotificationDisplay".

Für die Verwaltung, wenn die Aktivität bereits ausgeführt wird, haben Sie zwei Möglichkeiten:

  1. In FLAG_ACTIVITY_SINGLE_TOP Flag auf die Absicht, wenn die Aktivität gestartet, und dann in der Aktivitätsklasse implementieren onNewIntent (Intent Absicht) Event-Handler, auf diese Weise können Sie Zugriff auf die neue Absicht, die für die Aktivität genannt wurde (das als nur anrufen getIntent () nicht das gleiche ist, wird dies immer die erste Absicht zurück, die Ihre Aktivitäten ins Leben gerufen.

  2. Das gleiche wie die Nummer eins, sondern eine Fahne auf die Absicht des Hinzufügens Sie müssen hinzufügen "singleTop" in Ihrer Tätigkeit AndroidManifest.xml.

Wenn Sie Absicht Extras verwenden, remeber zu Anruf PendingIntent.getActivity() mit der Flagge PendingIntent.FLAG_UPDATE_CURRENT, da sonst die gleichen Extras für jede Meldung wiederverwendet werden.

Andere Tipps

hatte ich das ähnliche Problem meiner Anwendung zeigt Nachricht Benachrichtigungen. Wenn mehrere Mitteilungen sind, und klicken Sie jede Meldung zeigt es, dass eine Meldung Detail in einer Aktivitätsansicht Nachricht. Ich löste das Problem der gleichen zusätzlicher Parameter im Hinblick Nachricht Absicht empfangen werden.

Hier ist der Code, der dieses Problem behoben. Code für die Erstellung der Meldung Intent.

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

-Code für Ansicht Nachrichtenaktivität.

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


}

Vielleicht ein bisschen spät, aber: statt dessen:

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

Verwenden Sie diese:

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

Encounter gleiches Problem hier. Ich nehme mir vor es durch verschiedene Anforderungscode verwenden, verwenden dieselbe ID als Benachrichtigung, während PendingIntent zu schaffen. aber immer noch nicht wissen, warum dies getan werden sollte.

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

Nach der Lektüre einiger E-Mail-Listen und andere Foren fand ich, dass der Trick som einzigartige Daten an die Absicht hinzuzufügen scheint.

wie folgt aus:

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

Ich verstehe nicht, warum diese getan werden muss, es hat etwas mit der Absicht, kippe zu tun nur identifiziert werden durch seine Extras ...

Ich habe alles versucht, aber nichts funktionierte.

kam schließlich mit folgenden Lösung auf.

1- in manifest add für die Aktivität             Android: launchMode = "singleTop"

2- während machen anhängige Absicht die folgenden Schritte aus, die Verwendung Bündel statt direkt unter Verwendung intent.putString () oder 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); 

AndroidManifest.xml

Fügen Sie launchMode = "singleTop"

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

SMSReceiver.java

Stellen Sie die Flags für die Intent und 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 (.) - wird jedes Mal aufgerufen, die Extras laden

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

Hope hilft es, es wurde auf andere Antworten hier auf Stackoverflow basiert, aber dies ist die aktuellste, die für mich gearbeitet.

Es ist einfach, das ist meine Lösung Objekte mit!

Mein POJO

public class Person implements Serializable{

    private String name;
    private int age;

    //get & set

}

Methode Mitteilung

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

Neue Aktivitäten

 private Person person;

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

Good Luck !!

Nach etwas Suche zu tun i-Lösung von android Entwicklerführungs bekam

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

Intent Mehrwert in Test Aktivitätsklasse erhalten müssen Sie folgenden Code schreiben:

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

Wenn Sie

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

in AndroidManifest.xml-Datei für die Aktivität zu starten, haben Sie die folgenden in Ihrer Absicht zu verwenden:

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

Wichtig ist einzigartig Daten einzustellen z.B. unter Verwendung einer eindeutigen Kennung wie:

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

für Service verwenden PendingIntent.FLAG_UPDATE_CURRENT

für mich zu arbeiten.

Bitte als PendingIntent verwenden, während Benachrichtigung zeigt als wird es aufgelöst werden.

PendingIntent Absicht = PendingIntent.getActivity (this, 0,                 notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);

In PendingIntent.FLAG_UPDATE_CURRENT als letztes Feld.

In Ihrer Benachrichtigung Implementierung, verwenden Sie einen Code wie folgt aus:

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 zusätzliche Werte in der ExampleActivity zu erhalten, verwenden Sie den folgenden Code:

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

SEHR WICHTIGER HINWEIS: Intent :: putExtra () Methode ist ein Überladen ein. Um die zusätzlichen Schlüssel zu erhalten, müssen Sie verwenden Intent :: get [Typ] Extra () Methode.

Hinweis: NOTIFICATION_ID und NOTIFICATION_CHANNEL_ID ist eine Konstante in ExampleActivity erklärte

G'day, Ich kann auch sagen, dass ich alles, was in diesem Posten und ein paar mehr von anderer Stelle erwähnt versucht. Die # 1 Problem für mich war, dass das neue Intent ein Null-Paket immer hatte. Mein Problem war zu viel in der Fokussierung auf die Details von „habe ich .this oder .das enthalten“. Meine Lösung war, einen Schritt zurück aus dem Detail und Blick auf die Gesamtstruktur der Mitteilung zu nehmen. Als ich das tat, dass ich die wichtigsten Teile des Codes in der richtigen Reihenfolge platzieren verwaltet. Also, wenn Sie mit ähnlichen Fragen prüfen:

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

2a. Bundle bundle = new Bundle();

// Ich mag den Datentyp viel besser angeben. zB 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());

Mit dieser sequence ich ein gültiges Paket erhalten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top