2013-07-04 54 views
11

目前我們有一個啓動屏幕顯示在我們的應用程序中。但是,如果沒有要等待收集或處理的數據,我們想直接進入我們的第一個活動。有沒有辦法做到這一點,而不需要啓動閃屏?有條件地設置Android中的第一個活動

濺射屏幕部分的的AndroidManifest.xml如下:

<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> 

回答

20

我過去成功的做法是創建作爲主要活動的無形活動。它永遠不會顯示給用戶,因爲它會在構造函數中啓動「正確」的活動。

由於這個原因,沒有必要將活動設置爲「不可見」,因爲它不會加載視圖。

在裏面我放置了一些邏輯,它決定了哪個活動首先顯示給用戶。這對我的用例非常合適 - 試試看。


艙單申報(注意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> 

注:正如指出out in comments below,該launchmode設置無關這個問題IIRC。這與EntryActivity啓動的各種方式有關。


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

在這種情況下,android:launchMode =「singleInstance」的用途是什麼?當我包含它時,我的應用程序中沒有任何後續活動顯示在歷史記錄中(我的應用程序不存在於最近的應用程序列表中)。但是,當我排除這條線時,一切似乎都按預期工作。 – jokeefe

+1

@jokeefe IIRC這是我爲了回答問題而留下的生產代碼的一部分。我認爲你是對的 - 不需要回答這個問題。在我的情況下,它必須處理這種'EntryActivity'啓動的不同方式...... –

+0

噢,不錯。我希望我沒有忽略某些東西。謝謝你回到我身邊! – jokeefe

1

AFAIK你只能有1個主要活性。

當我遇到這個問題時,我做了什麼總是啓動主要活動(不是飛濺),並且在onCreate()方法中,我會在需要時啓動啓動屏幕。

+0

這是不幸的,如果是這樣的話。問題是,如果用戶尚未登錄,我們可以從Splash Screen,主要活動或登錄活動開始,因此沒有「中心」活動。 – StackOverflowed

+0

這並不壞......我認爲你應該讓用戶看到你最主要的活動,並在其onCreate中做一些檢查 – dors

1

你可以做這樣的事情:

  1. 閃屏是主要的活動(發射器類別)
  2. 如果你的啓動畫面可以加載數據(或任何你的啓動畫面做),做到這一點。完成後,關閉spalsh屏幕(調用finish())並開始真正的第一個活動並按照額外的意圖傳遞數據。
  3. 如果你的啓動畫面無法加載數據或(或任何你閃屏一樣),通過使用意圖開始下一個活動,並通過調用完成()

所以您的應用程序的工作流程完成spalsh屏幕活動將是:

  1. 點擊啓動圖標
  2. 閃屏活動將一直啓動
  3. 如果spalsh屏幕無法加載,比活動將立即結束,其他活動將開始。如果立即完成()立即屏幕活動,您的應用程序用戶將不會注意到初始屏幕活動,因爲在此情況下屏幕上從不顯示活動
2

鑑於發射將開始您在清單中指定的活動,這是不可能的,以設置該活動是否將開始(或其他)的條件。

所以留給你的選項,理查德·勒Mesurier和DORS建議:

  1. 啓動主的活動,則需要
  2. 啓動圖形界面的活動啓動飛濺活動(沒有佈局文件),然後決定哪些活動應該呈現給用戶

我更喜歡第二個選項,或者如果你打算反正介紹片段,在這裏使用它們:

  1. 使用Fragments。開始你的主要活動,它有一個片段佔位符。如果您需要顯示啓動畫面,請在該活動中加載SplashScreenFragment,否則,將構成第一個有用畫面的片段加載到用戶。

另外,不鼓勵使用啓動畫面;作爲一個用戶,我寧願看到大多數靜態UI組件立即被加載的主Activity,並且一些屏幕上顯示某些東西正在加載/更新。

相關問題