80

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

直到现在我所有的尝试都是徒劳的。我尝试了 anddev.org 提到的方法,但我的问题是主 Activity 应该启动但在我填充我的 ListActivity 之前启动画面应该是可见的。所以简而言之,我必须经过以下步骤:

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

希望你明白它是什么样的......

4

5 回答 5

89

问题很可能是您在与所有正在完成的工作相同的线程中运行启动画面(我假设是某种对话框,例如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目前)。

可以在此处此处找到有关 Android 中 AsyncTasks 主题的更多好读物。

于 2009-12-30T19:35:42.147 回答
61

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

我在androids 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>
于 2011-08-14T14:18:52.990 回答
1
  1. 开始我的主要活动。
  2. 显示启动画面。
  3. 继续在后台运行该进程。
  4. 处理完成后退出启动画面并显示主列表。

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

我是这样做的:

  1. 启动启动画面
  2. 流程完成后,开始“主要活动”
  3. 不要忘记处理后退按钮,因此它应该关闭应用程序 ist 将在主活动中按下。否则会回到启动画面(循环)

我的问题是如何通过按下菜单按钮来禁用“显示启动画面活动的菜单”。

编辑:

禁用显示菜单:

@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;
}
于 2013-02-07T15:03:36.310 回答
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);

    }

}
于 2014-06-09T07:10:21.973 回答
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 中添加的。

以及它所说的简短摘录:

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

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

于 2021-01-18T23:15:21.650 回答