Ho un'applicazione, che inizia con un SplashScreenActivity
. Successivamente, viene mostrato un LoginActivity
oppure, se l'utente ha già effettuato l'accesso, viene mostrato un numero MainActivity
. Se l'applicazione è già in esecuzione, SplashScreenActivity
è respinto con la seguenteAndroid: BackStack si comporta male, se l'applicazione è stata avviata da un'altra app
//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;
}
}
problema si verifica
Se inizio l'applicazione da un'altra attività, come PlayStore, si riprende l'attività giusta se già in esecuzione. Questo è il Intent
che sto usando per riprodurre all'interno di una seconda applicazione
//AnotherApplication.apk
Intent launchIntent = getPackageManager().getLaunchIntentForPackage("my.package.name");
startActivity(launchIntent);
Tuttavia, questa azione è in qualche modo rompendo il Backstack. Invece di chiudere l'applicazione su backpress nel MainActivity
, riavvia l'applicazione.
//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);
}
Ho usato i punti di interruzione e ho scoperto che MainActivity: OnDestroy() vengono chiamati, ma invece di riprendere applicazione alla HomeScreen, si riavvia sempre e io non so perché.
Ho provato il seguente: - Utilizzato diverse modalità di avvio come singleTask
e singleInstance
, ma non ha fatto alcuna differenza. onNewIntent
si chiama, ma se chiamo finish
, HomeActivity
riavvia - come commeted di seguito, ho provato moveTaskToBack(true)
, ma l'attività è restaring troppo (e abbiamo davvero voglia di chiudere l'applicazione, invece di spostarlo al BackStack)
Nella mia esperienza, 'getLaunchIntentForPackage (...)' * non * restituisce un intento di avvio. Un intento di avvio solleverà l'attività esistente, ma gli intenti restituiti da 'getLaunchIntentForPackage (...)' ne avviano effettivamente uno nuovo. La tua app potrebbe non riavviarsi quando tornerai indietro; potresti semplicemente vederne un'altra copia. –
@KevinKrumwiede: Intent ha il seguente tipo 'android.intent.action.MAIN', ho appena aggiunto del codice aggiuntivo, come gestisco l'intento – longilong
Non riesco a trovare nulla che lo dica esplicitamente, ma sospetto che solo il sistema sia autorizzato a ricevere "ACTION_MAIN". –