Comportmento indesiderato con button di schiena in un'attività di login

Quindi sto costruendo un'applicazione, e ha una schermata di login / login con un button di login di facebook. Dopo che l'utente accede, e un object utente che restituisce informazioni, voglio inserire alcuni dati nel database (non ancora nel codice, ma non import) e quindi aprire l'attività MainActivity .

Ciò che accade è che al primo lancio tutto funziona correttamente: se l'utente è già connesso (= c'è una session triggers), viene avviata l'attività MainActivity . Se l'utente non è connesso, un button di accesso indica che richiede all'utente di accedere e apre nuovamente l'attività MainActivity sul successo.

  • Come gestire Dynamic JSON in Retrofit?
  • Implementare Visualizzazione espandibile utilizzando l'adattatore personalizzato
  • Elenca tutte le immagini della camera in Android
  • Modifica la frequenza di riproduzione di una traccia in tempo reale su Android
  • Tastiera che nasconde EditTexts in frammenti
  • La barra di stato diventa bianca e non mostra contenuti dietro
  • Se un utente colpisce il button Indietro da MainActivity , viene visualizzato uno schermo bianco e rimane in quel modo. Se viene nuovamente premuto il button Indietro, l'applicazione si chiude e, quando viene ripresa l'applicazione (ad esempio, dalla window "Applicazioni recenti"), lo schermo bianco viene visualizzato per altri 1-2 secondi e prosegue quindi su MainActivity .

    Penso che succede perché cerca di tornare alla SplashActivity ma fin da quando finish() non posso … anche se non sono così sicuro da quando ho cercato di pulire il backstack usando Intent.FLAG_ACTIVITY_CLEAR_TOP e Intent.FLAG_ACTIVITY_NEW_TASK

    Cosa potrebbe causare questo comportmento? Come potrei risolvere il problema?

    Info aggiuntive:
    SplashActivity è impostato per lanciare come lanciatore dell'app, usando il intent-filter nel manifesto dell'app: <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter>
    – Testato su HTC Sensation XE / w Android 4.1

    Ecco un codice ( SplashActivity ):

     public class SplashActivity extends Activity { private UiLifecycleHelper uiHelper; private Session.StatusCallback callback = new Session.StatusCallback() { @Override public void call(Session session, SessionState state, Exception exception) { onSessionStateChange(session, state, exception); } }; private ArrayList<String> permissions; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.splash); uiHelper = new UiLifecycleHelper(this, callback); uiHelper.onCreate(savedInstanceState); permissions = new ArrayList<String>(); permissions.add("email"); permissions.add("user_birthday"); Session session = Session.getActiveSession(); if(session != null && session.isOpened()) { if(!session.getPermissions().contains(permissions)) { session.requestNewReadPermissions(new Session.NewPermissionsRequest(SplashActivity.this, permissions)); } } else { LoginButton authButton = (LoginButton) findViewById(R.id.login_button); authButton.setReadPermissions(permissions); } } @Override protected void onResume() { super.onResume(); uiHelper.onResume(); } @Override protected void onPause() { super.onPause(); uiHelper.onPause(); } private void onSessionStateChange(Session session, SessionState state, Exception exception) { if(session != null && state.isOpened()) { Request.executeMeRequestAsync(session, new Request.GraphUserCallback() { @Override public void onCompleted(GraphUser user, Response response) { if (user != null) { //no code here yet } } }); Intent intent = new Intent(SplashActivity.this, MainActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent); finish(); } } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); uiHelper.onActivityResult(requestCode, resultCode, data); } @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); uiHelper.onSaveInstanceState(outState); } @Override public void onDestroy() { super.onDestroy(); uiHelper.onDestroy(); } } 

  • limite di connessione mqtt mosquitto linux
  • Come controllare una sola casella di controllo alla volta in NLview Listview
  • Come creare un DialogFragment senza titolo?
  • Android - width e altezza di bitmap senza caricarlo
  • Problema di lettura firebase. Oggetto sempre nullo
  • App Widget mentre mostra l'elenco delle immagini
  • 2 Solutions collect form web for “Comportmento indesiderato con button di schiena in un'attività di login”

    Sembra che tu non desideri che tu abbia la spruzzata sul tuo stack. Se è così, puoi fare qualcosa di simile per lanciare l'attività principale.

      Thread nohistory = new Thread () { public void run () { try { Intent i = new Intent(Splash.this, ActivitySplash.class); i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(i); finish(); } catch (Exception e) { e.printStackTrace(); } } }; nohistory.start(); 

    spero che questo ti aiuti.

    Trovato la soluzione!

    Apparentemente era questa if linea:
    if(!session.getPermissions().contains(permissions))

    Quello che ha fatto è verificare se le mie permissions ARRAY (come un object) si session.requestNewReadPermissions(new Session.NewPermissionsRequest(SplashActivity.this, permissions)); all'interno dell'arrays delle autorizzazioni della session corrente e se non (che è sempre, fondamentalmente), sparare session.requestNewReadPermissions(new Session.NewPermissionsRequest(SplashActivity.this, permissions)); .

    Tutto quello che faccio è stato semplicemente cambiarlo in una delle mie stringhe di matrici di autorizzazioni:
    if(!session.getPermissions().contains("email"))

    E ora funziona! Nessun schermo bianco più. Non so perché ha causato un comportmento simile … forse perché l'attività non ha potuto finish() correttamente … non ha idea, ma funziona.

    Come ho scoperto:
    Semplicemente inserito Log.i() all'interno del if e notato che sempre si accende anche se non dovrebbe.

    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.