zoukankan      html  css  js  c++  java
  • Android创建启动画面

       每一个Android应用启动之后都会出现一个Splash启动界面,显示产品的LOGO、公司的LOGO或者开发人员信息。假设应用程序启动时间比較长,那么启动界面就是一个非常好的东西,能够让用户耐心等待这段枯燥的时间。

      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的跳转。

    image

    如上所看到的,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 的状态与它在栈中的位置关系例如以下图:

    image

     

    上图的样例是

    从 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里的东西比較多的时候,假设我们还把启动画面也加进去,势必会影响程序的效率,所以实际应用的话,第一个方法是首选。


  • 相关阅读:
    [最新]制作u盘引导安装ubuntu11.04
    js记录
    下面的代码有什么不妥之处
    Oracle常用命令
    蓝天下,献给你,html5
    无意义的小东西
    sql中,把varchar类型转换为int型,然后进行排序
    身边的人,来来去去
    不一定能写出来的求素数问题
    写在第一百篇博客之际
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/4244983.html
Copyright © 2011-2022 走看看