Android的SplashScreen

我正在开发一个应用程序,它基本上在应用程序本身开始时下载了大量数据,并将其显示在ListActivity中。 我打算做的是显示一个闪屏直到数据加载。

直到现在我所有的尝试都是徒劳的。 我试过anddev.org提到的方法,但我的问题是主要的活动应该开始,但飞溅屏幕应该是可见的,直到我填充我的ListActivity。 所以总之我要经过以下步骤:

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

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

这个问题很可能是你正在运行初始屏幕(某种对话框,比如我所假设的ProgressDialog ),它与所有正在执行的工作在同一个线程中运行。 这将保持启animation面的视图不被更新,这可以防止它被显示在屏幕上。 您需要显示启animation面,启动AsyncTask的实例以下载所有数据,然后在任务完成后隐藏启animation面。

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

不知道如何详细说明,而不显示代码,所以这里是:

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,因为我input这个目前)。

在这里和这里可以find更多关于Android中AsyncTasks的主题。

仅供参考,这是我发现做闪屏的最佳方式: http : //android-developers.blogspot.de/2009/03/window-backgrounds-ui-speed.html

我一直在寻找这个从androids文档的相当长一段时间..如果你想避免这些黑屏,你需要创build一个与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,从第一秒的splashscreen。

如果你想要一个复杂的背景,而不只是一个图像,将被拉伸填充,你可以使用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> 

闪屏示例:

 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); } } 
  1. 开始我的主要活动。
  2. 显示启animation面。
  3. 继续在后台运行进程。
  4. 处理完成后退出Splashscreen并显示主列表。

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

我这样做了:

  1. 启动Splash屏幕
  2. 当进程完成时,启动“主要活动”
  3. 不要忘记处理后退button,所以它应该closures应用程序ist将在主要活动中按下。 否则会回到启animation面(循环)

我的问题是如何禁用“显示启animation面活动的菜单”按下菜单button。

编辑:

禁用显示菜单:

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