适用于“应用程序”类的Android Splash屏幕

时间:2010-09-30 19:32:05

标签: android android-activity splash-screen

我有一个Android应用程序,我扩展了基础Application类,以便设置一些全局变量。

public class MyApplication extends Application {

 private ArrayList<ModelClass> master_list; // global variable 1
 private DataBaseHelper db_helper; // global variable 2

 @Override
 public void onCreate() {
  super.onCreate();
  //do database work that will take about 5 seconds
 }
}

我希望在Application类工作时(即在创建主活动之前)向用户显示启动画面。有没有办法做到这一点?

4 个答案:

答案 0 :(得分:5)

您可以将SplashActivity作为开始活动。

当MyApplication完成它的工作后,您可以开始主要活动并处理启动画面。

但是不要在onCreate中执行繁重的数据库工作,创建另一个函数并在那里执行,否则您的启动活动将不会显示。

public class SplashActivity extends Activity
    @override
    protected void onResume() {
    //Create a thread
    new Thread(new Runnable() {
            public void run() {
                //Do heavy work in background
                ((MyApplication)getApplication()).loadFromDb();
                startActivity(new Intent(SplashActivity.this, MainActivity.class));
                finish(); //End this activity
            }
        }).start();
    }
}

答案 1 :(得分:3)

我在我的应用中执行此操作的方法是让您的主要活动扩展ActivityGroup。

public class App extends ActivityGroup {
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        setContentView(R.layout.splashscreen);
        new Thread(new Runnable() {
            public void run() {
                // do your loading here
                final LocalActivityManager lam = getLocalActivityManager();
                runOnUiThread(new Runnable() {
                    public void run() {
                        Intent mainIntent = new Intent(MainActivity.class, App.this);
                        Window w = lam.startActivity("main", mainIntent);
                        setContentView(w.getDecorView());
                    }
                }
            }
        }, "App loading thread").start();
    }
}

这样,当应用程序恢复时,您立即获得应用程序,而不是启动画面,并且您只加载一次数据(当应用程序启动时)。

我实际上使用它来确保用户在应用程序启动时登录,如果用户名/密码组合不正确,我不会启动主应用程序,而是启动登录屏幕:)

答案 2 :(得分:0)

首先,我认为有很多方法可以使用闪屏。直观地说,我不会只是为了加载特定的信息而有一个特殊的类/活动,因为为了保留这些信息,你必须保持活动在某个地方保持活跃 - 占用资源。

我的启动画面只是一个布局,最初加载主活动的onCreate(),然后加载数据库信息后,将布局更改为主活动布局。

类似的东西:

public void onCreate() {
    super.onCreate();
    setContentView(R.layout.splashscreen);
    //do database work that will take about 5 seconds
    setContentView(R.layout.mainscreen)
}

答案 3 :(得分:0)

我意识到这是在提出这个问题后相当远但我希望有人发现这有用,如果需要我会提供代码。我的方法是在名为“finishedLoading”的应用程序类中创建一个公共布尔值。我将应用程序启动到我的启动画面活动中,并且我每隔250毫秒检查一次是否finishLoading = true,当它执行时,我启动新活动。另一个很好的部分是我有一个小旋转器进度条,所以用户看到发生的事情和动画四周。