android bundled - So senden Sie Parameter von einem Benachrichtigungsklick an eine Aktivität?





notifications example (11)


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!!

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



Sehen Sie sich dieses Handbuch ( Erstellen einer Benachrichtigung ) und die Beispiele für ApiDemos "StatusBarNotifications" und "NotificationDisplay" an.

Um zu verwalten, ob die Aktivität bereits ausgeführt wird, haben Sie zwei Möglichkeiten:

  1. Fügen Sie dem Intent FLAG_ACTIVITY_SINGLE_TOP- Flag hinzu, wenn Sie die Aktivität starten, und implementieren Sie dann in der Aktivitätsklasse onNewIntent (Intent Intent) eine Ereignisbehandlungsroutine, mit der Sie auf die neue Absicht zugreifen können, die für die Aktivität aufgerufen wurde (was nicht dasselbe ist wie GetIntent) (), wird immer die erste Absicht zurückgegeben, die Ihre Aktivität gestartet hat.

  2. Genau wie Nummer eins, aber anstatt eine Markierung zur Absicht hinzuzufügen, müssen Sie "singleTop" in Ihrer Aktivität AndroidManifest.xml hinzufügen.

Wenn Sie Intent-Extras verwenden, vergessen Sie nicht, PendingIntent.getActivity() mit dem Flag PendingIntent.FLAG_UPDATE_CURRENT , da andernfalls die gleichen Extras für jede Benachrichtigung wiederverwendet werden.




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


}



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

Benutze das:

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



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.




Nach einigen Suchen habe ich eine Lösung von Android Entwickler Guide

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

Um einen zusätzlichen Wert in der Testaktivitätsklasse zu erhalten, müssen Sie folgenden Code schreiben:

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



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



AndroidManifest.xml

Einschließlich launchMode = "singleTop"

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

SMSReceiver.java

Setzen Sie die Flags für 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, laden Sie die Extras.

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

Hoffe es hilft, es basierte auf anderen Antworten hier auf , aber das ist das neueste, das für mich funktionierte.




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



Die Methode zum Starten neuer Aktivitäten besteht darin, eine Absicht zu senden, und es gibt eine bestimmte Art von Absicht, mit der Sie Daten von einer Aktivität an eine andere übergeben können. Meine Empfehlung ist, dass Sie sich die Android-Entwickler-Dokumente intents , die sich auf intents beziehen; Es ist eine Fülle von Informationen zu diesem Thema und hat auch Beispiele.







android android-intent bundle notifications