2017-04-25 3 views
0

Je suis coincé avec un problème intéressant: j'ai une activité de type lanceur avec Theme.NoDisplay (aucune interface utilisateur) qui devrait lancer des activités différentes selon certaines conditions et même si je suis En appelant le startActivity(), il ne lancera aucun d'entre eux si l'application a été démarrée via l'icône du lanceur (elle démarre LauncherActivity mais meurt ensuite sans erreur/exception).Impossible de démarrer une activité différente de celle du lanceur Activité

CEPENDANT

Si je commence LauncherActivity par la BAD ou ajouter un délai à startActivity() il semble fonctionner très bien.

Voici un extrait de code.

public class LauncherActivity extends Activity { 

private Handler handler = new Handler(); 
private SharedPreferences preferences; 

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

    preferences = getSharedPreferences(App.getContext().getString(R.string.preferences_name), MODE_PRIVATE); 
    int pesel = preferences.getInt(App.getContext().getString(R.string.pref_pesel), 0); 
    String password = preferences.getString(App.getContext().getString(R.string.pref_password), ""); 

    Intent intent; 

    if (pesel != 0 && !password.isEmpty()) { 
     // TODO: server-side password check 
     intent = new Intent(this, MainActivity.class); 
    } else { 
     intent = new Intent(this, RegisterActivity.class); 
    } 

    Intent startIntent = getIntent(); 
    intent.setAction(startIntent.getAction()); 
    intent.setFlags(startIntent.getFlags()); 
    if (startIntent.getExtras() != null) 
     intent.putExtras(startIntent.getExtras()); 

    final Intent readyIntent = intent; 

    /* 
    THIS DOENS"T WORK (WORKS IF STARTED VIA ADB THOUGH) 
    */ 
    startActivity(readyIntent); 

    /* 
    THIS HOWEVER DOES WORK (ALWAYS) 
    */ 
    handler.postDelayed(new Runnable() { 
     @Override 
     public void run() { 
      startActivity(readyIntent); 
     } 
    }, 5000); 

    finish(); 
} 

}

+0

Montrez-nous votre manifeste? – t0mm13b

Répondre

0

j'ai trouvé moi-même solution.

Je suivais this blog post expliquant pourquoi nous devrions appeler finish() avant onResume() de Theme.NoDisplay Activités.

Pour résoudre mon problème je l'ai fait quelque chose comme ça et il semble fonctionner:

@Override 
protected void onDestroy() { 
    super.onDestroy(); 
    if (isFinishing() && intent != null) { 
     startActivity(intent); 
    } 
} 

Malheureusement, je n'ont pas expliquer clairement pourquoi, mais je vais le laisser ici de toute façon, pourrait aider quelqu'un.