2011-01-31 14 views
43

C'è un modo per modificare dinamicamente l'attività di avvio in Android in base a un condizionale? Quello che ho cercato di fare (che non ha funzionato) è stato il seguente:Attività di avvio dinamico in Android?

  1. rimuovere la categoria LAUNCHER come definito nel mio AndroidManifest.xml
  2. creare una classe un'applicazione personalizzata che l'applicazione utilizza
  3. esclusione della metodo onCreate della mia classe Application per definire un codice come il seguente:

.

if (condition) { 
    startActivity(new Intent(this, MenuActivity.class)); 
} else { 
    startActivity(new Intent(this, LoginActivity.class)); 
} 
+3

esattamente quello che ho cercato, grazie per averlo già chiesto. – mad

risposta

56

Perché non avere una prima Activity senza interfaccia utente che verifica la condizione nel suo onCreate, poi lancia la prossima Activity, quindi chiama finish() su se stesso? Non ho mai chiamato finish() da onCreate(), quindi non sono sicuro che funzionerà.

EDIT
Sembra funzionare correttamente. Ecco un codice per renderlo più chiaro.
iniziale Activity:

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    Intent intent; 
    if (condition) { 
     intent = new Intent(this, ClassA.class); 
    } else { 
     intent = new Intent(this, ClassB.class); 
    } 
    startActivity(intent); 
    finish(); 
    // note we never called setContentView() 
} 

Altro Activity:

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
} 
+0

Puoi avere un'attività senza interfaccia utente? Ho pensato che il punto centrale di un'attività fosse quello di mostrare qualcosa all'utente, ma forse ho bisogno di fare qualche rilettura sulle basi di Android ... –

+1

@Matt Huggins L'ho appena provato nel mio workspace scratch e sembra funzionare bene. –

+1

Questo è il punto centrale di un'attività, ma ci sono molti modi per aggirare questo problema. Penso che ciò che intendevo dire era semplicemente non dichiarare un'interfaccia utente. Non c'è niente che ti chieda di chiamare setContentView o altro. Fai il tuo controllo, inizia la tua prossima attività e vai avanti. – Falmarri

8

Ecco quello che ho personalmente fatto per uno dei miei piccoli progetti di telefonia mobile. Invece di creare un separato, screen-meno Activity in cui la condizione è e che lancia la schermata corrispondente, ho messo la condizione in una Activity e ha fatto una dinamica setContentView(), come in:

if (!userIsLoggedIn) { 
    setContentView(R.layout.signup); 
} else { 
    setContentView(R.layout.homescreen); 
} 

Due note importanti di questo approccio :

1: Invece di scrivere quello in onCreate(), si desidera mettere il processo decisionale all'interno di onResume() proprio perché quest'ultimo viene sempre chiamato ogni volta che lo schermo deve essere visualizzato in primo piano. Lo puoi vedere da Android activity life cycle. Quindi, se, ad esempio, l'utente ha appena scaricato la mia app e l'ha lanciata per la prima volta, poiché nessun utente ha effettuato l'accesso, verrà indirizzata alla pagina di registrazione. Quando ha terminato la registrazione e per qualche motivo preme il pulsante HOME (non BACK, che chiude completamente l'app!) E quindi riprende l'app, il layout che vedrà sarà già la schermata principale. Se inserisco il condizionale all'interno di onCreate(), quello che sarebbe stato visualizzato è lo schermo di registrazione perché, in base al ciclo di vita, non torna a onCreate() quando si riporta in primo piano un'app.

2: questa soluzione è ideale solo se la fusione delle funzionalità di queste due attività non produrrebbe un lungo blocco diabolico di codice. Come ho detto, il mio progetto era di dimensioni ridotte (la sua caratteristica principale si verifica in background), quindi la singola dinamica Activity non ne conteneva troppo. Lo screen-less Activity è sicuramente la soluzione ideale se hai bisogno che il tuo codice sia più leggibile.

+3

+1 per la condivisione di un metodo alternativo. :) Come già accennato, la mia unica preoccupazione con questo metodo è che ogni vista potrebbe richiedere un insieme di codice sottostante ampiamente diverso, il che renderebbe l'attività ingombrante e incongruente. –

+1

@MattHuggins questa soluzione probabilmente funziona meglio se si utilizza 'Fragment's che incapsula il' contentView' e il "set di codice sottostante in gran parte diverso". – TWiStErRob

Problemi correlati