2015-04-08 10 views
9

Sto lavorando a un'app con due attività: LoginActivity e MainActivity. Quando l'utente apre per la prima volta l'app, effettua l'accesso e le sue credenziali (nome utente e token) vengono salvate in Preferences.Come posso configurare l'attività Launcher in modo programmatico su Android?

Ora, se l'utente apre nuovamente l'applicazione, è necessario avviare MainActivity. Ho provato a passare tra queste attività in classe Application e rimosso intent-filter per LAUNCHER_ACTIVITY da manifest, ma non funziona.

Esiste un modo per passare da un'attività di avvio a livello di programmazione in base alle preferenze salvate?

+0

controllo se il login al LoginActivity utilizzando Preferenze, quindi aprire MainAcivity e finitura LoginActivity se utente è connesso – Yazan

+0

Se controllo preferenze MainActivity allora sarà meglio, come il passaggio per accedere attività si verifica meno senza di volte , destra ? –

+0

potrebbe essere, dipende dalla tua azienda, se alcuni dati vengono recuperati una volta che mainAcitivty viene caricato, allora potresti ricevere alcuni errori se l'utente non ha effettuato l'accesso, altrimenti potrebbe andare bene. – Yazan

risposta

11

Per farla breve, non è possibile modificare lo Activity avviato di default. Aggiornamento: C'è un'alternativa come descritto da CommonsWare in un'altra risposta.

Tuttavia, ci sono delle soluzioni ragionevoli. Nel tuo MainActivity puoi verificare se l'utente è loggato e immediatamente reindirizzare a LoginActivity. Che ha il vantaggio di tornare automaticamente alla MainActivity dopo aver effettuato il login.

In alternativa, si può sempre andare prima alla LoginActivity, e se l'utente è già connesso, inviarli al MainActivity (riscrivere l'Intent cronologia per rimuovere il ritorno a LoginActivity o impostare il flag noHistory nel manifest).

+0

Penso che proverò a controllare MainActivity. Grazie :) –

2

Un'attività non richiede necessariamente un'interfaccia utente, quindi è possibile utilizzare l'attività di avvio nel file manifest per eseguire qualsiasi attività desiderata.

3

Il modo più semplice è quello di rendere l'attività di avvio MainActivity, come al solito.
Quindi controllare MainActivity#onCreate(Bundle) tramite SharedPreferences se l'utente ha già effettuato l'accesso e, in caso contrario, avviare immediatamente LoginActivity. Quando l'utente esegue l'accesso, salva il flag booleano che indica che l'utente ha effettuato il login in SharedPreferences e finisce MainActivity.

16

Esiste un modo per passare da un'attività di avvio a livello di programmazione in base alle preferenze salvate?

Si può provare questo:

Passo # 1: Avere LoginActivity avere la LAUNCHER<intent-filter> come normale, e hanno MainActivity non hanno <intent-filter>.

Passo # 2: Avere an <activity-alias> element in the manifest punta a MainActivity che ha il LAUNCHER<intent-filter>.

Passo # 3: Mettere android:enabled="false" sul <activity-alias>, quindi è disabilitato per impostazione predefinita, in modo che quando l'applicazione è installato per primo, l'icona del lanciatore è solo per LoginActivity.

Passo # 4: Quando l'utente accede al sistema, e si desidera cambiare così MainActivity è l'attività di lancio, utilizzare PackageManager e setComponentEnabledSetting() per rendere il <activity-alias> abilitato e per disattivare l'LoginActivity.

Non tutte le schermate iniziali rileveranno questa modifica al volo e, per quelle, il dispositivo dovrebbe essere riavviato con ogni probabilità per rilevare la modifica. Per questo motivo, sarebbe meglio attenersi a un'unica attività di avvio. Se lo desideri, l'attività di avvio potrebbe avere Theme.NoDisplay e semplicemente indirizzare all'attività "reale" corretta in onCreate(), per risposta di Fahim.

+2

Impari qualcosa di nuovo ogni giorno. Bel consiglio. – Knossos

2

Per quanto ne so, cambiare programma di avvio non è possibile, ma non ha senso.

Sul tuo LoginActivity onCreate controlla se un nome utente e un token sono già stati salvati, se si tenta di accedere automaticamente con quello, è possibile eseguire il reindirizzamento al tuo MainAcivity. A seconda del modo in cui la tua app funziona, puoi avere una variabile che controlla se un utente ha effettuato l'accesso o meno, se è il LoginActivity lo reindirizza a MainActivity senza tentare di accedere nuovamente.

//LoginActivity 
onCreate(Bundle bundle) 
{ 
    /* ... */ 

    //Or whatever you use to login (it could also go inside a thread or an AsyncTask 
    if (login()) 
    { 
     //Intent 
     Intent intent = new Intent(this, MainActivity.class); 

     //Start Activity 
     startActivity(intent); 

     //Finish this activity, so when user pressed back the login activity will not come forth and the app will exit 
     //this looks like when a user has logged in once, the login screen will not be visible to him (unless you want to) 
     finish(); 
    } 
} 

È anche possibile configurare per salvare il nome utente e il token solo se un accesso riesce che significa che il codice di cui sopra può essere modificato in questo modo:

if (getUsername() != null) 
{ 
    /* Start Main Activity */ 
} 

Questo non tenterà di accedere, ma sa che le credenziali sono corrette poiché ha effettuato l'accesso almeno una volta con loro.

Se la vostra applicazione si comporta un modo diverso che questi metodi non funzionano, non esitate a dirlo, io possa essere in grado di fornire più informazioni

0

È possibile finite aggiungere intenti dopo OnCreate per il codice XML che si desidera visualizzare all'inizio della tua APP.

public class LoginActivity extends Activity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     //add some code to detect if user is logged in 
     if (user != null){ 
      Intent in = new Intent(LoginActivity.this, YourDesiredActivity.class); 
      startActivity(in); 
     } 
    .......... 
    ........... 
Problemi correlati