20

目前,我们的应用程序中显示了一个启动画面。但是,如果没有等待收集或处理的数据,我们希望直接进入我们的第一个活动。有没有办法做到这一点而无需启动屏幕闪烁?

闪屏部分的 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>
4

4 回答 4

26

我过去成功做的是创建一个无形的活动作为主要活动。它永远不会显示给用户,因为它在构造函数中启动了“正确”的活动。

出于这个原因,没有必要将活动主题设置为“不可见”,因为它不加载视图。

在里面我放置了一些逻辑来确定首先向用户显示哪个活动。这非常适合我的用例 - 试一试。


清单声明(注意noHistory="true"参数):

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

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

} 
于 2013-07-04T19:39:18.277 回答
2

鉴于启动器将启动您在清单中指定的活动,因此无法设置是否启动该活动(或其他)的条件。

因此,您可以选择 Richard Le Mesurier 和 dors 建议的选项:

  1. 启动主 Activity,然后在需要时启动 Splash Activity
  2. 启动一个无 gui 的 Activity(无布局文件),然后决定应该向用户呈现哪个 Activity

我更喜欢第二个选项,或者如果您打算引入 Fragments,请在此处使用它们:

  1. 使用Fragments. 开始你的主要活动,它有一个片段占位符。如果您需要显示 Splash Screen,请在该活动中加载 SplashScreenFragment,否则,将构成第一个有用屏幕的 Fragment 加载给用户。

顺便说一句,不鼓励使用闪屏。作为用户,我希望看到主 Activity 立即加载了大多数静态 UI 组件,并在屏幕上显示某些内容正在加载/更新。

于 2013-07-04T19:48:17.720 回答
1

afaik 你只能有 1 个主要活动。

当我遇到这个问题时,我所做的总是启动主要活动(而不是启动),如果需要,我会在其 onCreate() 方法中启动启动屏幕。

于 2013-07-04T16:32:32.187 回答
1

你可以这样做:

  1. 您的启动画面是主要活动(启动器类别)
  2. 如果您的初始屏幕可以加载数据(或您的初始屏幕所做的任何事情),请执行此操作。完成后,关闭spalsh屏幕(调用finish())并开始真正的第一个活动并将数据作为intent extra传递。
  3. 如果您的启动画面无法加载数据或(或您的启动画面所做的任何事情),请使用 Intent 启动下一个 Activity,并通过调用 finish() 完成启动屏幕活动

因此,您的应用程序的工作流程将是:

  1. 单击启动器图标
  2. 启动画面活动将始终启动
  3. 如果 spalsh 屏幕无法加载,则该 Activity 将立即完成并启动其他 Activity。如果您立即完成()启动屏幕活动,您的应用程序用户将不会注意到启动屏幕活动,因为在这种情况下该活动永远不会显示在屏幕上
于 2013-07-04T16:54:28.603 回答