2010-03-05 5 views
31

Ich habe eine Benachrichtigung in der Statusleiste für meine App:eine Aktivität aus einer Meldung der Wiederaufnahme

Notification notification = new Notification(R.drawable.icon, null, System.currentTimeMillis()); 

    Intent notificationIntent = new Intent(this.parent, MainActivity.class); 
    PendingIntent contentIntent = PendingIntent.getActivity(this.parent, 0, notificationIntent, 0); 

    ... 

    notification.flags = Notification.FLAG_ONGOING_EVENT;   
    mNotificationManager.notify(NOTIFICATION_ID, notification); 

Das Problem dabei ist, dass, wenn Sie die Home-Taste aus der App drücken (es auf den Hintergrund drängen) Drücken Sie dann auf die Benachrichtigung in der Liste, auf die über die Statusleiste zugegriffen wird. Daraufhin wird eine neue Kopie der Aktivität gestartet. Alles, was ich tun möchte, ist, die App wieder aufzunehmen (etwa wenn Sie die Home-Taste lang drücken und auf das Icon der App drücken). Gibt es eine Möglichkeit, eine Absicht dafür zu schaffen?

+0

Check this: http://stackoverflow.com/questions/3305088/how-to-make-notification-intent-resume-rather-than-making-a- new-intent/39482464 # 39482464 – TharakaNirmana

Antwort

30

Ich habe dieses Problem gelöst, indem ich die launchMode meiner Aktivität zu singleTask in der androidManifest.xml-Datei geändert habe.

Der Standardwert für diese Eigenschaft ist standard, wodurch eine beliebige Anzahl von Instanzen ausgeführt werden kann.

"singleTask" - und "singleInstance" -Aktivitäten können nur eine Aufgabe starten. Sie sind immer die Wurzel des Aktivitätsstapels. Darüber hinaus kann das Gerät nur eine Instanz der Aktivität gleichzeitig speichern - nur eine solche Aufgabe. [...]

Die Modi "singleTask" und "singleInstance" unterscheiden sich auch nur in einer Hinsicht: Eine "singleTask" -Aktivität ermöglicht, dass andere Aktivitäten Teil ihrer Aufgabe sind. Es ist immer die Wurzel seiner Aufgabe, aber andere Aktivitäten (notwendigerweise "Standard" - und "singleTop" -Aktivitäten) können in diese Aufgabe gestartet werden. Eine "singleInstance" -Aktivität hingegen erlaubt keine anderen Aktivitäten an ihrer Aufgabe teilzunehmen. Es ist die einzige Aktivität in der Aufgabe. Wenn es eine andere Aktivität startet, wird diese Aktivität einer anderen Aufgabe zugewiesen - als ob FLAG_ACTIVITY_NEW_TASK in der Absicht war.

finden Sie eine detaillierte Erklärung in der finden Android Developers' Guide

Ich hoffe, das

+1

Danke, das war super –

+1

Sieh dir auch '' 'android: launchMode =" singleTop "' '' an, das passt auch und wird unter "normale Starts" aufgelistet. –

+0

verwenden Sie eine der (singleTask, singleTop, singleInstance), fand ich die Aktivität Task-Stack wurde gebrochen, Task-Stack gelöscht alle anderen Aktivitäten – Ninja

-1

Ich benutze:

notificationIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP); 
notificationIntent.setAction(Intent.ACTION_MAIN); 

Nicht sicher, das sind die Werte, die Sie festlegen müssen, aber die Antwort ist in diesen Verfahren/Fahnen.

+0

Ich habe versucht, die oben genannten, aber es funktioniert nicht, können Sie eine vollständige Benachrichtigung Beispiel, das funktioniert? –

+0

@EnesBattal Entschuldigung, ich habe diesen Code nicht mehr verfügbar (ging mit meiner App anders). Das Absichtsflagding ist ein großes Durcheinander. Ich glaube nicht, dass ich es jemals wirklich herausgefunden habe. – gnobal

1

Ich habe gefunden, nur eine Lösung für dieses Problem: Ich habe getPreviousIntent Methode und gab es PendingIntent `s alle:

private Intent getPreviousIntent(Intent newIntent) { 
    final ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); 
    final List<ActivityManager.RecentTaskInfo> recentTaskInfos = am.getRecentTasks(1024,0); 
    String myPkgNm = getPackageName(); 

    if (!recentTaskInfos.isEmpty()) { 
     ActivityManager.RecentTaskInfo recentTaskInfo; 
     for (int i = 0; i < recentTaskInfos.size(); i++) { 
      recentTaskInfo = recentTaskInfos.get(i); 
      if (recentTaskInfo.baseIntent.getComponent().getPackageName().equals(myPkgNm)) { 
       newIntent = recentTaskInfo.baseIntent; 
       newIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
      } 
     } 
    } 
    return newIntent; 
} 
+0

Wie können wir es ausstehende Absicht geben? können Sie bitte teilen Sie Code – yrahman

+0

Hier Ti ist gelöst http://stackoverflow.com/questions/31448840/android-how-to-open-last-activity-when-Tapping-notification – nAkhmedov

1

Ich war ein ähnliches Problem hat und die richtige Art und Weise zu handhaben ist, die Fahnen zu verwenden: Intent.FLAG_ACTIVITY_CLEAR_TOP und Intent.FLAG_ACTIVITY_SINGLE_TOP wie so

notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); 

Aus der Dokumentation dieses Wille:

FLAG_ACTIVITY_CLEAR_TOP

Wenn gesetzt, und die Aktivität gestartet wurde, ist bereits in der aktuellen Aufgabe ausgeführt wird, dann, anstatt eine neue Instanz dieser Aktivität starten, alle anderen Aktivitäten auf ihn geschlossen und Diese Absicht wird als neue Absicht an die (jetzt oben) alte Aktivität geliefert.

FLAG_ACTIVITY_SINGLE_TOP

Wenn gesetzt, wird die Aktivität nicht gestartet werden, wenn er bereits an der Spitze der Geschichte Stapel läuft.

1

Fügen Sie diese Zeile zu der entsprechenden Aktivität in der Manifestdatei Ihrer App hinzu.

android:launchMode="singleTask" 

zB:

<activity 
    android:name=".Main_Activity" 
    android:label="@string/title_main_activity" 
    android:theme="@style/AppTheme.NoActionBar" 
    android:launchMode="singleTask" /> 
Verwandte Themen