Absichtserklärung
Meine Android-app wird immer aufgerufen, durch eine Absicht, die Weitergabe von Informationen (pendingintent in der Statusleiste).
Wenn ich drücken Sie die home-Taste und öffnen Sie die app, indem Sie die home-Taste ruft es die Absicht wieder, und die gleichen extras sind immer noch da.
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
super.onSaveInstanceState(savedInstanceState);
}
@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
}
dies ist der code, der läuft nicht wie sein soll
String imgUrl;
Bundle extras = this.getIntent().getExtras();
if(extras != null){
imgUrl = extras.getString("imgUrl");
if( !imgUrl.equals(textView01.getText().toString()) ){
imageView.setImageDrawable( getImageFromUrl( imgUrl ) );
layout1.setVisibility(0);
textView01.setText(imgUrl);//textview to hold the url
}
}
Und meine Absicht:
public void showNotification(String ticker, String title, String message,
String imgUrl){
String ns = Context.NOTIFICATION_SERVICE;
NotificationManager mNotificationManager =
(NotificationManager) getSystemService(ns);
int icon = R.drawable.icon; //icon from resources
long when = System.currentTimeMillis(); //notification time
CharSequence tickerText = ticker; //ticker-text
//make intent
Intent notificationIntent = new Intent(this, activity.class);
notificationIntent.putExtra("imgUrl", imgUrl);
notificationIntent.setFlags(
PendingIntent.FLAG_UPDATE_CURRENT |
PendingIntent.FLAG_ONE_SHOT);
PendingIntent contentIntent =
PendingIntent.getActivity(this, 0,
notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT |
PendingIntent.FLAG_ONE_SHOT);
//make notification
Notification notification = new Notification(icon, tickerText, when);
notification.setLatestEventInfo(this, title, message, contentIntent);
//flags
notification.flags = Notification.FLAG_SHOW_LIGHTS |
Notification.FLAG_ONGOING_EVENT |
Notification.FLAG_ONLY_ALERT_ONCE |
Notification.FLAG_AUTO_CANCEL;
//sounds
notification.defaults |= Notification.DEFAULT_SOUND;
//notify
mNotificationManager.notify(1, notification);
}
Gibt es eine Möglichkeit, zu deutlich die Absicht oder überprüfen Sie, ob es verwendet wurde, vor?
Kommentar zu dem Problem
Können Sie Ihre codes?
Ich habe den code auf meine Frage
Anstelle von deaktivieren Absicht, Sie könnten bestimmen Sie den Start-Typ und der Handhabung der app flow entsprechend. Holen Sie sich die Extras nur, wenn es gestartet wurde, für die Meldung und nicht aus dem hintergrund. stackoverflow.com/questions/4116110/clearing-intent/...
InformationsquelleAutor der Frage Mars | 2010-11-07
Du musst angemeldet sein, um einen Kommentar abzugeben.
UPDATE:
Ich wusste nicht, dass diese Antwort genannt werden würde, so viel als ich das erste schrieb er mehr als 5 Jahren!
Werde ich klären, darauf hin, dass als pro @tato-rodrigo beantworten, dies wird nicht helfen, Sie erkennen einen bereits behandelt Absicht, in einigen Situationen.
Außerdem sollte ich darauf hinweisen, das ich trage "klar" in Anführungszeichen, für einen Grund - Sie sind nicht wirklich clearing die Absicht, dies zu tun, du bist nur mit dem entfernen der zusätzlichen als ein flag, das diese Absicht wurde von der Aktivität bereits.
Ich hatte genau das gleiche Problem.
Obige Antwort hat mich auf den richtigen Weg und ich fand eine noch einfachere Lösung, verwenden Sie die:
Aufruf der Methode "clear" der Vorsatz.
Sein ein bisschen spät beantworten, da dies gefragt wurde, vor einem Jahr, aber ich hoffe, das hilft anderen in der Zukunft.
InformationsquelleAutor der Antwort Maks
EDIT: bin ich editieren, um die post-die komplette Lösung, die ich verwende.
Diese Lösung wird funktionieren, wenn das problem ist "Nicht ausführen von code, wenn die Aktivität beginnt, aus der Geschichte (Recent-Apps)".
Zunächst deklarieren Sie eine
boolean
in IhremActivity
zu geben, wenn dieIntent
war bereits verbraucht:Dann, sicher speichern und wiederherstellen dieser Wert mit der
onSaveInstanceState
undonCreate
Methoden für den Umgang mit änderungen an der Konfiguration und den Fällen, die das system töten IhreActivity
wenn es geht in den hintergrund.Prüfen Sie jetzt, wenn Sie können führen Sie Ihren code unter
onResume
Methode.Darüber hinaus, wenn Ihr
Activity
konfiguriert ist, umsingleTop
Sie zurücksetzen, sollten Sie Ihre fahne, wenn eine neueIntent
geliefert wird.InformationsquelleAutor der Antwort tato.rodrigo
Maks Antwort arbeitet für das clearing extra:
Ein weiterer nützlicher Befehl ist:
Könnte man auch markieren, in der Absicht, durch aufrufen:
und dann einfach überprüfen Sie den Wert.
InformationsquelleAutor der Antwort Slynk
InformationsquelleAutor der Antwort Mickey Tin
Wenn wir starten Sie Android-apps aus der Geschichte ("Letzte Apps"), die app eingeleitet werden könnten, in Erster Linie drei verschiedene Intent-flags.
FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY
Dies ist, wenn die Aktivität gestartet wird von der Geschichte eine app, die minimiert (lange drücken Sie die home-Taste).
Konstanter Wert: 1048576 (0x00100000)
FLAG_ACTIVITY_NEW_TASK
Dies ist, wenn die Aktivität gestartet wird mittels "Klick-Anwendung-Symbol" oder über "Vorsatz-Filter". Hier die Aktivität wird zu Beginn einer neuen Aufgabe auf diese Geschichte stack.
Konstanter Wert: 268435456 (0x10000000)
FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY | FLAG_ACTIVITY_NEW_TASK
Dies ist, wenn die app beendet wurde, durch drücken der zurück-Taste und dann wieder aus der Geschichte ("Letzte apps").
Konstanter Wert: 269484032 (0x10100000)
Konstante Wert kann abgerufen werden über
getIntent().getFlags()
Im Dritten Fall, Android lädt die zuletzt Vorsatz Werte aus dem Gedächtnis. Damit Ihre app den intent (
getIntent
) haben Werte aus der letzten Absicht, dass die Applikation gestartet.Eigentlich sollte die app sich Verhalten, als ob es ein frischer Start, mit Absichten, Werte, die für einen frischen Start, anstatt der Absicht, die Werte des vorherigen gestartet. Dieses Verhalten kann gesehen werden, wenn Sie die app starten, indem Sie auf das app-icon, es wird nie alt Vorsatz Werte. Dies liegt daran, dass Android verwendet die folgenden intent-filter für dieses Szenario
Aber im Dritten Fall (App beendet wurde, gestartet wird aus der Geschichte der Letzten apps), Android OS verwendet, die Letzte Absicht, dass die Applikation gestartet, bevor er beendet wurde (über drücken der zurück-Taste). So dass Sie am Ende mit alten Vorsatz Werte und der app flow ist nicht korrekt.
Entfernen Vorsatz ist eine Möglichkeit, es zu lösen, aber es würde nicht lösen das Problem vollständig! Als Android-OS wird die Absicht von den letzten apps zu starten, und nicht die Letzte Instanz der Einführung Absicht.
Saubere Art und Weise dies zu vermeiden, behandeln Sie es immer über die Art der Absicht, um zu bestimmen, den Start-Typ.
Also in Ihrem LaunchActivity (Die eine hat was der intent-filter im manifest definiert), könnten Sie den folgenden code in die
onCreate()
,onStart()
oderonResume()
Methoden.Vermute ich
normalLaunch()
, sollten Sie nicht verwenden die Parameter aus dem Vorsatz; sonst würden Sie brauchen, um auszusortieren und optimieren Sie Ihre Standard-Start-Methode nicht zu verwenden Vorsatz Parameter.InformationsquelleAutor der Antwort B.B.
Kurze Antwort ist Keine Möglichkeit
Lange Antwort. Es gibt keine solche Sache als "one-shot" - Vorsatz. Aus dem experiment ist zu beobachten, dass die jüngsten Aktivitäten Geschichte in der modernen Androiden ist nichts anderes als "Absicht Geschichte". Die neueste Absicht übergeben Aktivität einfach angemeldet system und das ist der deal. Leute oben, schlage
Aber es funktioniert nicht, weil der Vorsatz ist bereits angemeldet, bis der moment, Sie bekommen es innerhalb onNewIntent() oder onStart () - Methode.
Ich löste das problem durch Vermeidung der Verwendung von intents. Mein problem war simmiliar zu der eine des Autors. Ich versuchte Umsetzung Globaler Ausstieg aus der Anwendung über die Steuerung in der Benachrichtigungsleiste. Es sollte aufhören, den zugrunde liegenden Dienst und schließen Sie alle Aktivitäten der app. Finden Sie gleiche Verhalten in der Waze Anwendung.
Den Algorithmus:
Ich hoffe das hilft jemandem, weil ich nicht finden die Antwort im internet.
InformationsquelleAutor der Antwort Eugene Wechsler
Stellen Sie sicher, dass Sie mit PendingIntent.FLAG_UPDATE_CURRENT Flagge für PendingIntent.
Wo
mPutIntent
ist IhreIntent
.Hoffe, dies wird Ihnen helfen.
InformationsquelleAutor der Antwort Hiren Patel
Ich habe genau das gleiche problem. Meine Lösung war, fügen
boolean
variable gesetzt wurde, wennIntent
war "gebraucht" undif
- Anweisung basierend auf dieserboolean
um zu überprüfen, ob Sie verwenden solltenIntent
oder nicht.InformationsquelleAutor der Antwort pixel
Wenn Sie fertig sind die Bearbeitung der Absicht, dies zu tun:
Sehen Sie nicht, dass verarbeitete Absicht wieder, und Sie werden nicht verdeckt das problem, indem Sie die Inhalte der verarbeiteten Absicht.
InformationsquelleAutor der Antwort straya
Ich hatte kürzlich dieses problem, und ich löste es durch hinzufügen einer timestamp als zusätzlichen parameter an die Absicht:
Danach speichern Sie den Zeitstempel für die gemeinsamen Vorlieben:
InformationsquelleAutor der Antwort Antonio Martínez Guerola
Diese Weise arbeitete, zu mir:
InformationsquelleAutor der Antwort Doug
Selbst nach dem manuellen löschen der Vorsatz und die Absicht extras, nachdem Sie analysiert wurden, scheint es, als ob Aktivität.getIntent() wird immer wieder der ursprünglichen Absicht, die begann die Tätigkeit.
Um dies zu umgehen, empfehle ich etwas wie dieses :
Diese Weise, es ist ein Mechanismus, um einen dump der ursprünglichen Absicht, unter Beibehaltung der Fähigkeit, zu behalten sich ausdrücklich auf bestimmte Teile der ursprünglichen Absicht /Vorsatz extras.
Beachten Sie, dass ich noch nicht getestet, alle Aktivitäten starten-Modi.
InformationsquelleAutor der Antwort dell116
Dies wird hoffentlich jeder.
Also zuerst bekommen wir die Absicht
Platz dieses irgendwo onCreate
Nun legen wir das jedes mal also, wenn unsere app wird zerstört oder verlassen, entfernen wir die Daten
Du auf die Idee, wenn das ist nicht genug, nur finden mehr 'auf' Rückrufe
InformationsquelleAutor der Antwort Pixeldroid Modding
Ich konnte nicht einen Weg finden, zu entfernen Absicht Extra. Keine Antworten zu entfernen extra aus Vorsatz funktioniert, wenn Sie aktivieren "Nicht Halten Aktivitäten" aus Entwickler-Optionen (auf diese Weise können Sie zerstören Aktivität und kommen zurück, um zu testen, ob die Extras sind immer noch da).
Als Lösung zu das problem, dass ich gespeicherte boolean-Wert in SharedPreferences nach Absicht Zusätze verarbeitet werden. Bei der gleichen Absicht übermittelt, um die Aktivität, ich check das SharedPreference Wert und entscheiden Prozess die Absicht Zusätzliche. Im Falle Sie senden einem anderen neuen Vorsatz Extra für gleiche Tätigkeit, die Sie machen SharedPreference Wert false und die Aktivität zu verarbeiten. Beispiel:
InformationsquelleAutor der Antwort Jemshit Iskenderov
Straight forward Weg ist, um zu vermeiden, aufrufen getIntent() von anderen Methoden als der onCreate(). Aber dies wird Ursache problem beim nächsten Start, wenn der Benutzer die Links unserer Tätigkeit durch Tippen auf die Home-Taste. Ich denke, dass dieses problem nicht über eine voll funktionsfähige Lösung.
InformationsquelleAutor der Antwort mifthi
Dem ich mich dem gleichen problem und versuchen durch die oben genannten Methoden, aber es funktioniert nicht.
Ich denke, es kann dazu führen, Tätigkeit launch-Modus, die ich verwendet singleTop-Modus.
Wenn ich die hintergrund-app und verwenden Sie RamEater zu simulieren, Problem, das die Absicht hat immer extra sogar ich es einstellen, null-oder entfernen-Taste.
Das problem ist Weg von über Vorliebe Lagerung auf Android zu überprüfen, das musste passieren.
InformationsquelleAutor der Antwort Thanawat Masileerungsri
Wie über dieses? Setzt newIntent als die Absicht.
InformationsquelleAutor der Antwort coolcool1994
Wie wäre es, wenn Sie wollen, deaktivieren Sie das intent - ersetzen Sie es mit einem leeren?
zB.
InformationsquelleAutor der Antwort Iftah
InformationsquelleAutor der Antwort Ramkumar
Während der
Intent.removeExtra("key")
entfernen einer bestimmten Schlüssel von den extras, es ist auch die Methode Absicht.replaceExtras(Bundle), die verwendet werden können, zu löschen, die ganzen extras aus der Absicht, wennnull
als parameter übergeben wird.Aus der docs:
Weil die putXXX () - Methode initialisiert die extras mit einem frischen Bündel, wenn Ihr null ist, ist dies kein problem.
InformationsquelleAutor der Antwort Steve Benett