[android] So senden Sie Parameter von einem Benachrichtigungsklick an eine Aktivität?


Answers

Ich hatte das ähnliche Problem, dass meine Anwendung Nachrichtenbenachrichtigungen anzeigt. Wenn mehrere Benachrichtigungen vorhanden sind und auf jede Benachrichtigung geklickt wird, werden diese Benachrichtigungsdetails in einer Nachrichtenansichtsaktivität angezeigt. Ich löste das Problem der gleichen zusätzlichen Parameter wird in Ansicht Nachricht Absicht erhalten.

Hier ist der Code, der das behoben hat. Code zum Erstellen der Benachrichtigung 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 zum Anzeigen der 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);
        }
    }


}
Question

Ich kann eine Möglichkeit finden, Parameter von meiner Benachrichtigung an meine Aktivitäten zu senden.

Ich habe einen Dienst, der eine Benachrichtigung erstellt. Wenn der Benutzer auf die Benachrichtigung klickt, möchte ich meine Hauptaktivität mit einigen speziellen Parametern öffnen. ZB eine Artikel-ID, sodass meine Aktivität eine spezielle Artikeldetailansicht laden und präsentieren kann. Genauer gesagt, ich lade eine Datei herunter, und wenn die Datei heruntergeladen wird, möchte ich, dass die Benachrichtigung eine Absicht hat, dass sie beim Anklicken meine Aktivität in einem speziellen Modus öffnet. Ich habe versucht, putExtra auf meine Absicht putExtra , aber ich kann es nicht putExtra , also denke ich, dass ich es falsch mache.

Code von meinem Dienst, der die Benachrichtigung erstellt:

        // 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 von meiner Aktivität, die versucht, den zusätzlichen Parameter aus der Benachrichtigung abzurufen:

 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 bekomme nie etwas in mein Logbuch.

Übrigens ... das onCreate wird nur ausgeführt, wenn meine Aktivität startet, wenn meine Aktivität bereits gestartet ist, möchte ich auch die Extras sammeln und meine Aktivität gemäß der Item_ID präsentieren, die ich erhalte.

Irgendwelche Ideen?




Treffen Sie das gleiche Problem hier. Ich löse es auf, indem ich einen anderen Anforderungscode verwende, benutze dieselbe ID wie die Benachrichtigung und erzeuge PendingIntent. weiß aber immer noch nicht, warum das gemacht werden sollte.

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



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

Mein POJO

public class Person implements Serializable{

    private String name;
    private int age;

    //get & set

}

Methodenbenachrichtigung

  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ät

 private Person person;

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

Viel Glück!!




Wenn du benutzt

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

In Ihrer AndroidManifest.xml-Datei für die zu startende Aktivität müssen Sie Folgendes in Ihrer Absicht 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, eindeutige Daten zu setzen, zB mit einer eindeutigen ID wie:

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



Bitte verwenden Sie als PendingIntent, während die Benachrichtigung angezeigt wird, bevor sie gelöst wird.

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

Fügen Sie PendingIntent.FLAG_UPDATE_CURRENT als letztes Feld hinzu.




Ich habe alles versucht, aber nichts hat funktioniert.

kam schließlich mit folgender Lösung auf.

1- in Manifest hinzufügen für die Aktivität Android: launchMode = "singleTop"

2- Wenn Sie pending intent machen, verwenden Sie bundle, anstatt direkt intent.putString () oder intent.putInt () zu verwenden.

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



Related