赞
踩
1.制作Splash界面
突出产品LOGO,产品名称,产品主要特色;
注明产品的版本信息;
注明公司信息或者开发者信息;
背景图片,亦可以用背景颜色代替;
2.处理后台资源
大多数的Splash界面都是会等待一定时间,然后切换到下一个界面;
其实,在这段时间里,可以对系统状况进行检测,比如网络是否通,电源是否充足;
或者,预先加载相关数据;
为了能让启动界面展现时间固定,需要计算执行以上预处理任务所花费的时间,那么:启动界面SLEEP的时间=固定时间-预处理任务时间;
思路有两个,一个是用两个Activity来做,一个用来做启动画面,另一个是主页面;还可以用一个Activity来做,程序启动时显现启动画面,当启动完成后,它会被隐藏来。
方法一:两个Activity,通过线程延迟指定的时间再执行Activity的跳转,我们需要建立两个Activity,一个是SplashActivity,用来做启动画面。另一个是HelloWorldActivity。在这里只是说明如何来做启动画面,所以就不详细来完成Activity了。
核心代码:
package com.demo.app; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.os.Handler; public class SplashActivity extends Activity { private final int SPLASH_DISPLAY_LENGHT = 6000; // 延迟六秒 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.splash); new Handler().postDelayed(new Runnable() { public void run() { Intent mainIntent = new Intent(SplashActivity.this, HelloWorldActivity.class); SplashActivity.this.startActivity(mainIntent); SplashActivity.this.finish(); } }, SPLASH_DISPLAY_LENGHT); } }
说明:
Handler().postDelayed 是延迟指定的时间再执行
Handler类主要可以使用如下3个方法来设置执行Runnable对象的时间:
- // 立即执行Runnable对象
- public final boolean post(Runnable r);
- // 在指定的时间(uptimeMillis)执行Runnable对象
- public final boolean postAtTime(Runnable r, long uptimeMillis);
- // 在指定的时间间隔(delayMillis)执行Runnable对象
- public final boolean postDelayed(Runnable r, long delayMillis);
下面两行代码启动一个新的Activity,同时关闭当前Activity。
- SplashActivity.this.startActivity(mainIntent);
- SplashActivity.this.finish();
下面再讲一下Activity的生命周期,方便大家理解Activity的跳转。
如上所示,Android 程序员可以决定一个 Activity 的“生”,但不能决定它的“死”,也就时说程序员可以启动一个 Activity,但是却不能手动的“结束”一个 Activity。
当你调用 Activity.finish()方法时,结果和用户按下 BACK 键一样:告诉 Activity Manager 该 Activity 实例完成了相应的工作,可以被“回收”。
随后 Activity Manager 激活处于栈第二层的 Activity 并重新入栈,同时原 Activity 被压入到栈的第二层,从 Active 状态转到 Paused 状态。
例如上面例子中:从 SplashActivity 中启动了 HelloWorldActivity,则当前处于栈顶端的是 HelloWorldActivity,第二层是 SplashActivity 。
当我们调用 SplashActivity.finish()方法时(我们是在SplashActivity中通过SplashActivity.this.finish()调用的),SplashActivity 从 Active 状态转换 Stoped 状态,并被系统从栈中移除,标志可以被“回收”。
Activity 的状态与它在栈中的位置关系如下图:
上图的例子是
从 Activity1 中启动了 Activity2,则当前处于栈顶端的是 Activity2,第二层是 Activity1,当我们在 Activity2中调用 Activity2.finish()方法时,Activity Manager 重新激活 Activity1 并入栈,Activity2 从 Active 状态转换 Stoped 状态,同时标注Activity2可以被“回收” 。Activity1. onActivityResult(int requestCode, int resultCode, Intent data)方法被执行,Activity2 返回的数据通过 data参数返回给 Activity1。
还有一点要注意的是,不要忘了修改AndroidManifest.xml文件。如下:
- <?xmlversion="1.0"encoding="utf-8"?>
- <manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.demo.app"
- android:versionCode="1"
- android:versionName="1.0"
- <applicationandroid:icon="@drawable/icon";android:label="@string/app_name">
- <activityandroid:name=.SplashActivity"
- android:label="@string/app_name"> ;
- <intent-filter>
- <actionandroid:name="android.intent.action.MAIN"/>
- <categoryandroid:name="android.intent.category.LAUNCHER"/>
- </intent-filter>
- </activity>
- <activityandroid:name="Main">
- </activity>
- </application>
- <uses-sdkandroid:minSdkVersion="3"/>
- </manifest>
方法二:一个 Activity来做。程序启动时显现启动画面,当启动完成后,它会被隐藏来
布局文件:
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="vertical" android:layout_width="fill_parent"
- android:layout_height="fill_parent">
- <LinearLayout android:id="@+id/splashscreen"
- android:orientation="vertical"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent">
-
- <TextView android:id="@+id/info"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:gravity="center"
- android:paddingTop="10px"
- android:text="This is a splash !" />
- </LinearLayout>
-
- <TextView android:layout_width="fill_parent"
- android:paddingTop="10px"
- android:layout_height="wrap_content"
- android:text="This is a Context" />
- </LinearLayout>
说明:
这里有一个id为splashscreen的LinearLayout,是程序启动时显现的部分。当启动完成后,它会被隐藏。
核心代码:
package com.demo.app; import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.os.SystemClock; import android.view.View; import android.view.Window; import android.widget.LinearLayout; import android.widget.TextView; public class MainActivity extends Activity { private LinearLayout splash; private TextView tv; private static final int STOPSPLASH = 0; // time in milliseconds private static final long SPLASHTIME = 1000; private Handler splashHandler = new Handler() { public void handleMessage(Message msg) { switch (msg.what) { case STOPSPLASH: SystemClock.sleep(4000); splash.setVisibility(View.GONE); break; } super.handleMessage(msg); } }; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getWindow().requestFeature(Window.FEATURE_PROGRESS); setContentView(R.layout.main); splash = (LinearLayout) findViewById(R.id.splashscreen); tv = (TextView) findViewById(R.id.info); tv.setText("正在建立数据连接"); Message msg = new Message(); msg.what = STOPSPLASH; splashHandler.sendMessageDelayed(msg, SPLASHTIME); } }
当在应用启动后发送一个消息,把指定区域设置为隐藏, splash.setVisibility(View.GONE); 就实现了启动界面。
总结一下,个人觉得还是第一个方法比较合适,当一个程序主Activity里的东西比较多的时候,如果我们还把启动画面也加进去,势必会影响程序的效率,所以实际应用的话,第一个方法是首选。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。