2013-07-04 13 views
11

Obecnie mamy ekran powitalny, który jest wyświetlany w naszej aplikacji. Jeśli jednak nie ma danych do zebrania lub przetworzenia, które czekają, chcielibyśmy od razu przejść do naszej pierwszej działalności. Czy istnieje sposób, aby to zrobić bez migania ekranu powitalnego?Warunkowo ustawiona pierwsza aktywność w systemie Android

AndroidManifest.xml części ekran powitalny jest następujący:

<activity android:name="com.example.SplashScreenActivity" 
     android:label="@string/app_name" 
     android:noHistory="true" > 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 

Odpowiedz

20

To, co udało mi się zrobić w przeszłości, to stworzyć niewidoczna działalność jako główna działalność. Nigdy nie jest pokazywany użytkownikowi, ponieważ uruchamia "poprawną" aktywność w konstruktorze.

Z tego powodu nie ma potrzeby, aby temat działania był "niewidoczny", ponieważ nie ładuje widoku.

Wewnątrz I umieszczam pewną logikę, która określa, która czynność ma zostać wyświetlona użytkownikowi. Działa to idealnie w moim przypadku użycia - spróbuj.


Deklaracja Manifest (nota parametr noHistory="true"):

<activity 
     android:name=".activity.EntryActivity" 
     android:launchMode="singleInstance" 
     android:noHistory="true" > 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 
      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 

Uwaga: Jak wskazano out in comments below ustawienie launchmode nie ma związku z tym pytanie IIRC. Było to związane z różnymi sposobami, w jakie zainicjowano EntryActivity.


klasa EntryActivity:

public class EntryActivity extends Activity 
{ 

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

     // launch a different activity 
     Intent launchIntent = new Intent(); 
     Class<?> launchActivity; 
     try 
     { 
      String className = getScreenClassName(); 
      launchActivity = Class.forName(className); 
     } 
     catch (ClassNotFoundException e) 
     { 
      launchActivity = DefaultHomeActivity.class; 
     } 
     launchIntent.setClass(getApplicationContext(), launchActivity); 
     startActivity(launchIntent); 

     finish(); 
    } 

    /** return Class name of Activity to show **/ 
    private String getScreenClassName() 
    {  
     // NOTE - Place logic here to determine which screen to show next 
     // Default is used in this demo code 
     String activity = DefaultHomeActivity.class.getName(); 
     return activity; 
    } 

} 
+0

Jaki jest cel 'android: launchMode =" singleInstance "' w tym przypadku ? Gdy to uwzględniam, żadna z kolejnych czynności w mojej aplikacji nie pojawia się w historii (moja aplikacja nie jest obecna na liście Ostatnie aplikacje). Kiedy jednak wykluczyłem tę linię, wszystko wydaje się działać zgodnie z oczekiwaniami. – jokeefe

+1

@jokeefe IIRC to część kodu produkcyjnego, który zostawiłem, kiedy go wyrwałem, aby odpowiedzieć na pytanie. Myślę, że masz rację - nie trzeba odpowiadać na pytanie. W moim przypadku miało to związek z różnymi sposobami uruchamiania tego "EntryActivity" ... –

+0

Dobra. Miałem nadzieję, że niczego nie przeoczyłem. Dziękuję za to, że do mnie wróciłeś! – jokeefe

1

AFAIK można mieć tylko 1 główny aktywność.

To, co zrobiłem, gdy miałem ten problem, to zawsze rozpoczynam główną aktywność (nie splash), a w jego metodzie onCreate() w razie potrzeby uruchamiałbym ekran powitalny.

+0

To niefortunne, jeśli tak jest. Problem polega na tym, że możemy zacząć od ekranu powitalnego, głównej aktywności lub aktywności logowania, jeśli użytkownik nie jest jeszcze zalogowany, więc nie ma "centralnej" aktywności. – StackOverflowed

+0

To nie jest takie złe ... Myślę, że powinieneś sprawić, że użytkownik zobaczy większość swojej głównej aktywności i zrobić kilka kontroli w jego onCreate – dors

1

można zrobić coś takiego:

  1. Twój Ekran powitalny jest główną działalność (Launcher-Category)
  2. Jeśli ekran powitalny można załadować danych (lub niezależnie od splasha robi), zrób to. Po zakończeniu zamknij ekran spalsh (call finish()) i rozpocznij prawdziwą pierwszą czynność i przekaż dane jako cel dodatkowy.
  3. Jeśli splasha nie może wczytać dane lub (lub niezależnie od splasha nie), należy rozpocząć kolejny aktywny przy użyciu Intent i zakończyć Spalsh działalności ekranu przez wywołanie wykończenie()

So przepływu pracy z aplikacją będą:

  1. Kliknij ikonę wyrzutni
  2. Activity ekran powitalny będzie zawsze rozpoczął
  3. Jeśli Spalsh ekran nie może załadować, niż aktywność zostanie natychmiast zakończona i innych aktywność zostanie uruchomiona. Użytkownik aplikacji nie zauważy aktywności ekranu powitalnego po zakończeniu() natychmiastowego działania ekranu powitalnego, ponieważ działanie to nigdy nie jest wyświetlane na ekranie w tym przypadku:
2

Zważywszy, że wyrzutnia rozpocznie działalność wpisany w swoim manifeście, że nie jest możliwe, aby ustawić warunki od tego, czy działalność ta zostanie uruchomiony (lub innego).

Więc jesteś w lewo z opcjami jak Richard Le Mesurier i Dors sugerują:

  1. Zacznij głównej działalności, a następnie uruchomić aktywny Splash razie potrzeby
  2. podjęcie działalności gui-less (bez układu plik), a następnie zdecydować, który aktywny powinien być prezentowane użytkownikowi

wolałbym drugą opcję, lub jeśli masz zamiar wprowadzić Fragments tak, wykorzystać je tutaj:

  1. Użyj Fragments. Rozpocznij swoją główną aktywność, która zawiera element zastępczy Fragment. Jeśli chcesz pokazać ekran powitalny, załaduj w ten sposób funkcję SplashScreenFragment, w przeciwnym razie załaduj fragment, który jest pierwszym użytecznym ekranem dla użytkownika.

Odkłada się na bok stosowanie ekranów startowych; jako użytkownik wolałabym zobaczyć główną aktywność z natychmiastowym załadowaniem większości statycznych składników interfejsu użytkownika, a także wskazanie na ekranie, że coś się ładuje/aktualizuje.

Powiązane problemy