2015-08-06 8 views
6

Ich habe eine Anwendung, die mit einem SplashScreenActivity beginnt. Danach wird eine LoginActivity angezeigt, oder wenn der Benutzer bereits angemeldet ist, wird MainActivity angezeigt. Wenn die Anwendung bereits ausgeführt wird, SplashScreenActivity mit folgendenAndroid: BackStack funktioniert fehl, wenn Anwendung von einer anderen App gestartet wurde

//SplashScreenActivity 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    //Adding this check for following cases 
    if (!isTaskRoot()) 
    { 
     String intentAction = getIntent().getAction(); 
     if (getIntent().hasCategory(Intent.CATEGORY_LAUNCHER) && intentAction != null && intentAction.equals(Intent.ACTION_MAIN)) { 
      finish(); 
      return; 
     } 

     if(getIntent().getCategories().contains(GCMIntentService.INTENT_CATEGORY_GH_NOTIFICATION)){ 
      finish(); 
      return; 
     } 
    } 

Problem des Feldes verwiesen tritt

Wenn ich die Anwendung von einer anderen Aktivität wie Plays beginnen, nimmt es an der richtigen Aktivität, wenn bereits ausgeführt. Dies ist die Intent ich innerhalb einer Sekunde App

//AnotherApplication.apk 
Intent launchIntent = getPackageManager().getLaunchIntentForPackage("my.package.name"); 
startActivity(launchIntent); 

jedoch diese Aktion irgendwie bricht die Backstack zu reproduzieren bin mit. Anstatt die Anwendung auf Backpress in MainActivity zu schließen, startet es die Anwendung neu.

//MainActivity.class 
@Override 
public void onBackPressed() { 
    if (getNavDrawerMain().isDrawerOpen()) { 
     getNavDrawerMain().closeDrawer(); 
    } else { 
     closeApp(); 
    } 
} 

protected void closeApp() { 
    if (doubleBackToExitPressedOnce) { 
     //super.onBackPressed(); //i tried both, but behaviour is the same 
     finish(); 
     return; 
    } 
    this.doubleBackToExitPressedOnce = true; 

    new Handler().postDelayed(new Runnable() { 

     @Override 
     public void run() 
      doubleBackToExitPressedOnce = false; 
     } 
    }, 500); 
} 

Ich benutzte Haltepunkte und fand heraus, dass MainActivity: onDestroy() aufgerufen werden, sondern Anwendung auf den Homescreen wieder aufzunehmen, ist es immer neu gestartet, und ich weiß nicht, warum.

Ich habe folgendes versucht: - Benutzte verschiedene Launchmodes wie singleTask und singleInstance, aber es machte keinen Unterschied. onNewIntent genannt wird, aber wenn ich finish nennen, HomeActivity startet - wie unten commeted, habe ich versucht, moveTaskToBack(true), aber Aktivität ist restaring auch (und wir wollen wirklich die App statt Bewegen des Knopfes nach Backstack schließen)

+1

Meiner Erfahrung nach gibt 'getLaunchIntentForPackage (...)' * keine Launcher-Absicht zurück. Ein Launcher Intent wird den bestehenden Task auslösen, aber die Intents, die von 'getLaunchIntentForPackage (...)' zurückgegeben werden, werden tatsächlich einen neuen starten. Ihre App wird möglicherweise nicht neu gestartet, wenn Sie die App verlassen. Sie sehen vielleicht nur eine weitere Kopie davon. –

+1

@KevinKrumwiede: Intent hat folgende Art 'android.intent.action.MAIN', ich habe gerade etwas zusätzlichen Code hinzugefügt, wie ich die Absicht handle – longilong

+1

Ich kann nichts finden, was explizit so sagt, aber ich vermute, dass nur das System ist darf "ACTION_MAIN" erhalten. –

Antwort

1

Der Versuch, das Hinzufügen dieses Flag auf Ihre Absicht beginnen Ihre App: RESET_TASK_IF_NEEDED, URL = http://developer.android.com/reference/android/content/Intent.html#FLAG_ACTIVITY_RESET_TASK_IF_NEEDED

Was es tut:

Wenn gesetzt, und diese Aktivität wird entweder in einer neuen Aufgabe oder bringen an die Spitze eine vorhandene Aufgabe gestartet, dann es wird als die Haustür der Aufgabe gestartet werden.

Sie können auch verwenden: http://developer.android.com/reference/android/content/Intent.html#FLAG_ACTIVITY_REORDER_TO_FRONT

Was es tut:

Wenn in einer Intent auf Context.startActivity() übergeben, wird dieses Flag die gestartet Aktivität führen nach vorne gebracht werden Der Protokollstapel seiner Aufgabe, wenn er bereits ausgeführt wird.

Welche Sie verwenden, hängt vom gewünschten Endergebnis ab.

Wenn Sie nicht kontrollieren können, wer Sie startet, müssen Sie den Modus auf einzelne Aufgabe oder einzelne Instanz einstellen oder starten.

hier beschrieben:

http://inthecheesefactory.com/blog/understand-android-activity-launchmode/en

Der interessante Teil:

singleTask

Dieser Modus von Standard- und singleTop ganz anders.Eine Aktivität mit singleTask launchMode darf nur eine Instanz im System haben (a.k.a Singleton). Wenn es im System eine vorhandene Activity-Instanz gibt, wird die gesamte Task, die die Instanz enthält, nach oben verschoben, während die Intent-Methode über die onNewIntent() -Methode bereitgestellt wird. Andernfalls wird eine neue Aktivität erstellt und in die richtige Aufgabe eingefügt.

+0

Das Problem ist, dass der "Intent", wo ich die Flags hinzufügen soll, von (in unserem Fall) "Google Play Store" oder "HockeyApp" gestartet wird, so dass wir sie nicht ändern können. Oder habe ich deine Frage missverstanden? – longilong

+0

Oh, dann brauchen Sie nur eine einzige Instanz, aktualisierte Antwort. – JohanShogun

+0

"... verschiedene Startmodi ausprobiert, aber das machte keinen Unterschied ..." vielleicht hätte ich diesen Punkt deutlicher machen sollen. Ich habe 'singleTop',' singleTask' usw. versucht. Macht keinen Unterschied. Ich sehe, dass diese Aktivität zerstört wird, aber statt Previous Stack wieder auf 'onCreate() 'zu setzen – longilong

1

Versuchen Sie mit moveTaskToBack(true); anstelle von finish();, um die App zu schließen. Es wird dann zu OnRestart() und dann OnStart() -> OnResume() gehen (und OnCreate nicht gehen).

Und stellen Sie sicher, dass Sie in den Android-Einstellungen unter Entwickleroptionen nicht die Option "Aktivitäten nicht beibehalten" markiert haben (zerstören Sie jede Aktivität, sobald der Benutzer sie verlässt).

+1

Danke für den Kommentar, ich habe gerade versucht, aber Verhalten bleibt gleich ... – longilong

+0

Stellen Sie sicher, Sie Lassen Sie in den Android-Einstellungen unter "Entwickleroptionen" nicht die Option "Aktivitäten nicht behalten" markiert (zerstören Sie jede Aktivität, sobald der Benutzer sie verlässt). –