wake-up-neo.net

Android - Erstellen Sie eine Benachrichtigung, TaskStackBuilder.addParentStack funktioniert nicht

Ich versuche, eine Aktivität aus einer Benachrichtigung heraus zu starten, wie die Android-Dokumente erklären, aber wenn ich die Benachrichtigung öffne und dann die Zurück-Taste drücke, wird die HomeActivity (übergeordnete) nicht geöffnet, stattdessen wird die Anwendung geschlossen. Was mache ich falsch?

    Intent resultIntent = new Intent(context, MatchActivity.class);;
    resultIntent.setFlags(Intent.FLAG_ACTIVITY_MULTIPLE_TASK);

    TaskStackBuilder stackBuilder = TaskStackBuilder.create(context);

    // Adds the back stack for the Intent (but not the Intent itself)
    stackBuilder.addParentStack(MainActivity.class);

    stackBuilder.addNextIntent(resultIntent);
47
David Fortunato

Sie müssen den übergeordneten Stapel für die Aktivität, die Sie starten, hinzufügen, nicht den übergeordneten Stapel.

Ersetzen:

stackBuilder.addParentStack(MainActivity.class);

mit:

stackBuilder.addParentStack( MatchActivity.class );

Dies setzt voraus, dass Sie das übergeordnete Element in Ihrem Manifest (API 16+) definiert haben:

<activity Android:name=".MatchActivity"
    Android:parentActivityName=".MainActivity"
    ... />

Wenn Sie für API 16 entwickeln, müssen Sie das übergeordnete Element folgendermaßen definieren:

<activity Android:name=".MatchActivity">
    <meta-data
        Android:name="Android.support.PARENT_ACTIVITY"
        Android:value=".MainActivity" />
</activity>
90
Ralgha

Wenn keine der Lösungen funktioniert und Sie sicher sind, dass Sie alles genau befolgt haben ... dann müssen Sie uninstall die App und erneut installieren it . Für mich gearbeitet!

63
penduDev
Intent resultIntent = new Intent(App.getContext(), TargetActivity.class);
Intent backIntent = new Intent(App.getContext(), ParentActivity.class);
backIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
final PendingIntent resultPendingIntent = PendingIntent.getActivities(
                                    App.getContext(), 0, 
               new Intent[]{backIntent, resultIntent}, PendingIntent.FLAG_ONE_SHOT);
mNotifyBuilder.setContentIntent(resultPendingIntent);

dies löste mein Problem mit dem übergeordneten Stapel beim Benachrichtigungsklick

8
Rafael

Die Verwendung von TaskStackBuilder hat mein Problem nicht gelöst und funktioniert nur für Honeycomb und höher. Also nehme ich die folgende Lösung (bitte kreuzige mich nicht):

  1. Rufen Sie MainActivity anstelle von MatchActivity auf, und übergeben Sie MatchActivity als Argument (von Intent).
  2. Starten Sie in MainActivity.onCreate die Variable MatchActivity, falls der Parameter verfügbar ist.

Neuer Code:

Intent resultIntent = new Intent(context, MainActivity.class) //
        .putExtra(MainActivity.ACTIVITY_EXTRA, MatchActivity.class.getName()) //
        .putExtra("Pass extras to MatchActivity", "if you want! :)");

PendingIntent pendingIntent = PendingIntent.getActivity(context, visitId, resultIntent, PendingIntent.FLAG_UPDATE_CURRENT);

Notification notification = new NotificationCompat.Builder(context) //
            .setContentIntent(pendingIntent) //
            .build();

Bei MainActivity:

public static final String ACTIVITY_EXTRA = "activity";

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if (getIntent().getStringExtra(ACTIVITY_EXTRA) != null) {
        startActivity(new Intent(getIntent()).setClassName(this, getIntent().getStringExtra(ACTIVITY_EXTRA)));
    }
    ...
}
7
Italo Borssatto

Für mich hat der stackBuilder.addParentStack nicht funktioniert.

Ich ende damit, ich hoffe, das könnte dir helfen.

    Intent intent = new Intent(context, MatchActivity.class);

    TaskStackBuilder stackBuilder = TaskStackBuilder.create(context);
    // Adds the back stack for the Intent
    stackBuilder.addNextIntentWithParentStack(new Intent(context, MainActivity.class));
    stackBuilder.addNextIntent(intent);
    PendingIntent pendingIntent = stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);
3
Pablo

Haben Sie in der Android-Dokumentation nachgesehen, insbesondere die Notifications API-Anleitung. Es beschreibt ausführlich, wie das geht.

Beachten Sie, dass die Aktivität, die Sie mit der Benachrichtigung beginnen, nicht Teil des normalen Aktivitätsflusses ist, dann sollte nicht zur Startseite der App gehen. Stattdessen sollte der Startbildschirm angezeigt werden.

2
Joe Malin

Sie sollten dies zu MainActivity im AndroidManifest hinzufügen:

<activity
   Android:name=".MainActivity"
   Android:allowTaskReparenting="true" />
1
Rafa0809

Wie in anderen Antworten erwähnt, funktioniert TaskStackBuilder nicht für Versionen unterhalb von Honeycomb.

Meine Lösung bestand darin, die onBackPressed()-Methode der Aktivität außer Kraft zu setzen.

@Override
public void onBackPressed() {
    NavUtils.navigateUpFromSameTask(this);
}

Wenn Sie vorhaben, die Aktivität auf andere Weise abzuschließen, müssen Sie natürlich auch damit umgehen. (Obwohl ich mir vorstellen kann, dass finish() ein unerwartetes Verhalten überschreibt).

1
kassim

dies kann auch passieren, wenn Ihre Aktivität im Manifest next launchMode hat:

<activity Android:name=".SecondActivity"
     ...
         Android:launchMode="singleInstance"
         Android:parentActivityName=".MainActiviy"
    ...
/>
0
Andriy Antonov

Wenn Sie in Ihrem Projekt die Codegenerierung verwenden (wie Dagger), sollte die MainActivity.class durch die MainActivity_.class (oder wie auch immer Ihr übergeordneter Aktivitätsname ist) ersetzt werden. Ich habe einen ganzen Tag gebraucht, um das herauszufinden. Hoffe, das kann jemanden den Tag retten.

0
Mykola

Ich hatte das gleiche Problem! Lösen:

wechseln zu

PendingIntent resultPendingIntent = 

PendingIntent.getActivity( this, 0, resultIntent, PendingIntent.FLAG_UPDATE_CURRENT);

PendingIntent resultPendingIntent = 

stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);
0
Joelder