Android启动画面

时间:2009-12-30 10:43:13

标签: android splash-screen

我正在开发一个应用程序,它基本上会在应用程序本身的开头下载大量数据并将其显示在ListActivity中。我打算做的是显示一个启动画面,直到数据加载完毕。

直到现在我的所有尝试都是徒劳的。我试过anddev.org提到的方法,但我的问题是主Activity应该开始但是Splash Screen应该是可见的,直到我填充我的ListActivity。所以简而言之,我必须完成以下步骤:

  1. 开始我的主要活动。
  2. 显示启动画面。
  3. 继续在后台运行该过程。
  4. 处理完成后退出启动画面并显示主列表。
  5. 希望你明白它是什么样的......

5 个答案:

答案 0 :(得分:89)

问题很可能是你在所有工作的同一个线程中运行启动画面(某种Dialog,例如ProgressDialog我假设)。这将使得启动画面的视图不被更新,这可以防止它甚至被显示到屏幕上。您需要显示启动画面,启动AsyncTask实例以下载所有数据,然后在任务完成后隐藏启动画面。

所以你的Activity的onCreate()方法只会创建一个ProgressDialog并显示它。然后创建AsyncTask并启动它。我会将AsyncTask作为主Activity的内部类,因此它可以将已下载的数据存储到Activity中的某个变量中,并在其onPostExecute()方法中关闭ProgressDialog。

不知道如何在不显示代码的情况下再详细说明,所以这里是:

public class MyActivity extends Activity {
    private ProgressDialog pd = null;
    private Object data = null;

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        // Show the ProgressDialog on this thread
        this.pd = ProgressDialog.show(this, "Working..", "Downloading Data...", true, false);

        // Start a new thread that will download all the data
        new DownloadTask().execute("Any parameters my download task needs here");
    }

    private class DownloadTask extends AsyncTask<String, Void, Object> {
         protected Object doInBackground(String... args) {
             Log.i("MyApp", "Background thread starting");

             // This is where you would do all the work of downloading your data

             return "replace this with your data object";
         }

         protected void onPostExecute(Object result) {
             // Pass the result data back to the main activity
             MyActivity.this.data = result;

             if (MyActivity.this.pd != null) {
                 MyActivity.this.pd.dismiss();
             }
         }
    }    
}

显然有一些你需要填写的部分,但是这段代码应该运行并给你一个很好的起点(如果有代码错误,请原谅我,因为我没有访问Android SDK)我当前打字这个。)

可以在herehere找到关于Android中AsyncTasks主题的更多好读物。

答案 1 :(得分:59)

仅供参考,这是我发现制作启动画面的最佳方式: http://android-developers.blogspot.de/2009/03/window-backgrounds-ui-speed.html

我正在搜索这个问题很长一段时间,来自orroids docs ..如果你想避免那些黑屏,你需要用windowBackground创建一个主题,所以:

<resources>
    <style name="Theme.Shelves" parent="android:Theme">
        <item name="android:windowBackground">@drawable/background_shelf</item>
        <item name="android:windowNoTitle">true</item>
    </style>
</resources>

并将此主题设置为主要活动的主题...... TADA,第一秒的闪屏。

如果你想要一个复杂的背景,而不仅仅是一个可以拉伸填充的图像,你可以使用Drawables,这里是一个图层列表的例子,它将使徽标以黑色背景为中心:

<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >

    <item android:drawable="@color/black">
    </item>
    <item>
        <bitmap
            android:gravity="center"
            android:src="@drawable/logo"
            android:tileMode="disabled" >
        </bitmap>
    </item>
</layer-list>

答案 2 :(得分:1)

  
      
  1. 开始我的主要活动。
  2.   
  3. 显示启动画面。
  4.   
  5. 继续在后台运行该过程。
  6.   
  7. 处理完成后退出启动画面并显示主列表。
  8.   

我试过这种方式,但问题是;它将在启动启动画面活动之前显示主要活动。

我是这样做的:

  1. 启动启动画面
  2. 当流程完成后,启动“主要活动”
  3. 不要忘记处理后退按钮,因此它应该关闭App ist将在主要活动中按下。否则将返回启动画面(循环)
  4. 我的问题是如何通过按菜单按钮禁用“显示启动画面活动的菜单”。

    修改

    停用展示菜单:

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // getMenuInflater().inflate(R.menu.activity_main, menu);
        return false;
    }
    
    @Override
    public boolean onMenuItemSelected(int featureId, MenuItem item) {       
        // return super.onMenuItemSelected(featureId, item);
        return false;
    }
    

答案 3 :(得分:1)

启动画面示例:

public class MainActivity extends Activity {
    private ImageView splashImageView;
    boolean splashloading = false;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        splashImageView = new ImageView(this);
        splashImageView.setScaleType(ScaleType.FIT_XY);
        splashImageView.setImageResource(R.drawable.ic_launcher);
        setContentView(splashImageView);
        splashloading = true;
        Handler h = new Handler();
        h.postDelayed(new Runnable() {
            public void run() {
                splashloading = false;
                setContentView(R.layout.activity_main);
            }

        }, 3000);

    }

}

答案 4 :(得分:0)

我知道这个问题已经很老了,OP 可能不再需要它了。但我只想添加这个答案来帮助可能需要它来存档启动画面的人。

回答(仅适用于 Android Oreo 或更高版本)


实际上,在较新版本的 Android 中(Android Oreo 之后),它已经支持内置启动画面工具。这意味着您不需要创建额外的活动来做到这一点。你只需要一个可绘制的资源文件来展示。

使用这种方式可以更快地显示您的启动画面,并且在初始化后很快就会显示您的内容。但请注意,这仅适用于 Android Oreo 或更高版本。在以前的版本中,它会显示白色而不是启动画面(至少我是这么认为的)。

您的 AppTheme 样式中需要此行:

<item name="android:windowSplashscreenContent">@drawable/YOUR_SPLASH_SCREEN_DRAWABLE</item>

这是一个完整的例子:

<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <!-- Customize your theme here. -->

    <!-- Set your splash screen here, it accept a resource from drawable directory-->
    <item name="android:windowSplashscreenContent" tools:targetApi="o">@drawable/splash_screen</item>
</style>

参考


有关此属性的更多信息,请参阅此处的官方参考:https://developer.android.com/reference/android/R.attr#windowSplashscreenContent

正如它所说,它是在 API 级别 26 中添加的。

以及它所说内容的简短摘录:

<块引用>

对用作窗口启动画面内容的可绘制对象的引用。此 drawable 将放置在 windowBackground 的顶部,其边界由系统栏插入。如果系统栏不应该插入可绘制对象,请使用全屏主题。

<块引用>

请注意,即使没有在主题上设置启动画面内容,系统仍可能使用主题上的其他属性显示启动画面,例如 windowBackground