Android启动界面(Splash)的两种实现方法

时间:2021-05-21 16:46:48

  (一)用2个Activity实现

  用Handler对象的postDelayed方法来实现延迟跳转的目的。

  补充:Handler的常用方法:

1 //  立即执行Runnable对象  
2 public final boolean post(Runnable r);
3 // 在指定的时间(uptimeMillis)执行Runnable对象
4 public final boolean postAtTime(Runnable r, long uptimeMillis);
5 // 在指定的时间间隔(delayMillis)执行Runnable对象
6 public final boolean postDelayed(Runnable r, long delayMillis);

  1、activity_splash.xml:

 1 <?xml version="1.0" encoding="utf-8"?>
2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
3 android:layout_width="match_parent"
4 android:layout_height="match_parent"
5 android:orientation="vertical" >
6
7 <ImageView
8 android:layout_width="match_parent"
9 android:layout_height="wrap_content"
10 android:src="@drawable/ic_launcher" />
11
12 </LinearLayout>

  2、activity_main.xml:

 1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
2 android:layout_width="match_parent"
3 android:layout_height="match_parent"
4 android:orientation="vertical" >
5
6 <TextView
7 android:layout_width="match_parent"
8 android:layout_height="wrap_content"
9 android:text="这里是主界面" />
10
11 </LinearLayout>

  3、SplashActivity:

 1 package com.example.splashtest;
2
3 import android.app.Activity;
4 import android.content.Intent;
5 import android.os.Bundle;
6 import android.os.Handler;
7 import android.view.Window;
8
9 public class SplashActivity extends Activity {
10
11 private final int SPLASH_DISPLAY_LENGHT = 3000;
12 private Handler handler;
13
14 @Override
15 protected void onCreate(Bundle savedInstanceState) {
16 super.onCreate(savedInstanceState);
17 getWindow().requestFeature(Window.FEATURE_NO_TITLE);
18 setContentView(R.layout.activity_splash);
19
20 handler = new Handler();
21 // 延迟SPLASH_DISPLAY_LENGHT时间然后跳转到MainActivity
22 handler.postDelayed(new Runnable() {
23
24 @Override
25 public void run() {
26 Intent intent = new Intent(SplashActivity.this,
27 MainActivity.class);
28 startActivity(intent);
29 SplashActivity.this.finish();
30 }
31 }, SPLASH_DISPLAY_LENGHT);
32
33 }
34 }

  4、MainActivity:

 1 package com.example.splashtest;
2
3 import android.app.Activity;
4 import android.os.Bundle;
5 import android.view.Menu;
6 import android.view.MenuItem;
7
8 public class MainActivity extends Activity {
9
10 @Override
11 protected void onCreate(Bundle savedInstanceState) {
12 super.onCreate(savedInstanceState);
13 setContentView(R.layout.activity_main);
14 }
15 }

  6、修改AndroidManifest.xml文件:

 1      ...
2      <activity
3 android:name=".SplashActivity"
4 android:label="splash" >
5 <intent-filter>
6 <action android:name="android.intent.action.MAIN" />
7
8 <category android:name="android.intent.category.LAUNCHER" />
9 </intent-filter>
10 </activity>
11 <activity
12 android:name=".MainActivity"
13 android:label="@string/app_name" >
14 </activity>
15      ...

   7、在SplashActivity中禁用返回键:

1 @Override    
2 public boolean onKeyDown(int keyCode, KeyEvent event) {
3   if(keyCode == KeyEvent.KEYCODE_BACK){
4     return true;
5   }
6   return super.onKeyDown(keyCode, event);
7
8 }

  

  (二)用一个Activity实现

  主要利用控件的隐藏来实现。

  1、xml文件:

 1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
2 android:layout_width="match_parent"
3 android:layout_height="match_parent"
4 android:orientation="vertical" >
5
6 <LinearLayout
7 android:id="@+id/splash_lt"
8 android:layout_width="match_parent"
9 android:layout_height="match_parent" >
10
11 <ImageView
12 android:layout_width="match_parent"
13 android:layout_height="match_parent"
14 android:src="@drawable/ic_launcher" />
15 </LinearLayout>
16
17 <TextView
18 android:id="@+id/main_tv"
19 android:layout_width="match_parent"
20 android:layout_height="wrap_content"
21 android:text="这是主界面" />
22
23 </LinearLayout>

  2、MainActivity

 1 package com.example.splashtest2;
2
3 import android.app.Activity;
4 import android.os.Bundle;
5 import android.os.Handler;
6 import android.os.Message;
7 import android.os.SystemClock;
8 import android.view.Menu;
9 import android.view.MenuItem;
10 import android.view.View;
11 import android.view.Window;
12 import android.widget.LinearLayout;
13
14 public class MainActivity extends Activity {
15
16 private final int STOP_SPLASH = 0;
17 private final int SPLASH_TIME = 3000;
18
19 private LinearLayout splashLt;
20
21 private Handler splashHandler = new Handler() {
22 public void handleMessage(Message msg) {
23 switch (msg.what) {
24 case STOP_SPLASH:
25 splashLt.setVisibility(View.GONE);
26 break;
27 default:
28 break;
29 }
30
31 super.handleMessage(msg);
32 }
33 };
34
35 @Override
36 protected void onCreate(Bundle savedInstanceState) {
37 super.onCreate(savedInstanceState);
38 getWindow().requestFeature(Window.FEATURE_NO_TITLE);
39 setContentView(R.layout.activity_main);
40
41 splashLt = (LinearLayout) findViewById(R.id.splash_lt);
42
43 Message msg = new Message();
44 msg.what = STOP_SPLASH;
45
46 // 注:这里必须用延迟发送消息的方法,否则ImageView不会显示出来
47 splashHandler.sendMessageDelayed(msg, SPLASH_TIME);
48 }
49
50 }

 

  (三)小结

  建议使用第一种方法,用两个Activity实现,因为MainActivity中的代码不宜过多。