Android Splash界面支持用戶點擊 直接進入主界面

jopen 10年前發布 | 12K 次閱讀 Android開發 移動開發 Android Splash

現在大部分APP都有Splash界面,下面列一下Splash頁面的幾個作用:

1、展示logo,提高公司形象

2、初始化數據 (拷貝數據到SD)

3、提高用戶體驗 

4、連接服務器是否有新的版本等。

不過如果Splash頁面不做任何操作時,我更喜歡提供個用戶點擊Splash界面直接進入主界面。

一般我們的SplashActivity會這么寫:

    package com.example.testsplashdemo;

import android.os.Bundle;  
import android.os.Handler;  
import android.app.Activity;  
import android.content.Intent;  
import android.view.Menu;  
import android.view.MotionEvent;  

public class SplashActivity extends Activity  
{  
    private Handler handler = new Handler();  

    @Override  
    protected void onCreate(Bundle savedInstanceState)  
    {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.activity_main);  

        handler.postDelayed(new Runnable()  
        {  
            @Override  
            public void run()  
            {  
                Intent intent = new Intent(SplashActivity.this, MainActivity.class);  
                startActivity(intent);  
            }  
        }, 3000);  
    }  

}  </pre><a style="text-indent:0px;" title="派生到我的代碼片" href="/misc/goto?guid=4959614367510692784" target="_blank"></a></div>

</div> </div> 現在我們添加個用戶觸摸屏幕直接進入主界面:

    @Override
public boolean onTouchEvent(MotionEvent event)
{

        if(event.getAction()==MotionEvent.ACTION_UP)  
        {  
            Intent intent = new Intent(SplashActivity.this, MainActivity.class);  
            startActivity(intent);  
            finish();  
        }  

        return super.onTouchEvent(event);  
    }  </pre><a style="text-indent:0px;" title="派生到我的代碼片" href="/misc/goto?guid=4959614367510692784" target="_blank"></a></div>

</div>
</div>

然后測試,會發現用戶如果直接觸摸進入,當3秒后還是會再進入一次主界面。

于是我們改寫代碼為:

    package com.example.testsplashdemo;

import android.os.Bundle;  
import android.os.Handler;  
import android.app.Activity;  
import android.content.Intent;  
import android.view.Menu;  
import android.view.MotionEvent;  

public class SplashActivity extends Activity  
{  
    private Handler handler = new Handler();  
    private Runnable runnable;  

    @Override  
    protected void onCreate(Bundle savedInstanceState)  
    {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.activity_main);  

        handler.postDelayed(runnable = new Runnable()  
        {  
            @Override  
            public void run()  
            {  
                Intent intent = new Intent(SplashActivity.this, MainActivity.class);  
                startActivity(intent);  
                finish();  
            }  
        }, 3000);  
    }  

    @Override  
    public boolean onTouchEvent(MotionEvent event)  
    {  

        if(event.getAction()==MotionEvent.ACTION_UP)  
        {  
            Intent intent = new Intent(SplashActivity.this, MainActivity.class);  
            startActivity(intent);  
            finish();  
            if (runnable != null)  
                handler.removeCallbacks(runnable);  
        }  

        return super.onTouchEvent(event);  
    }  

}  </pre><a style="text-indent:0px;" title="派生到我的代碼片" href="/misc/goto?guid=4959614367510692784" target="_blank"></a></div>

</div> </div> 定義了個Runnable對象,用戶點擊后移除回調事件,解決了。

利用handler.postDelay和removeCallback還可以判斷用戶是否長按操作等。

可能有些哥們會問,我一般是通過發送消息進入主界面的,有什么好的處理方案嗎?

由于原理類似,我就直接貼代碼了:

    package com.example.testsplashdemo;

import android.os.Bundle;  
import android.os.Handler;  
import android.app.Activity;  
import android.content.Intent;  
import android.view.Menu;  
import android.view.MotionEvent;  

public class SplashActivity extends Activity  
{  
    private Handler handler = new Handler()  
    {  
        public void handleMessage(android.os.Message msg)  
        {  
            Intent intent = new Intent(SplashActivity.this, MainActivity.class);  
            startActivity(intent);  
            finish();  

            handler.removeMessages(-1);  
        };  

    };  
    private Runnable runnable;  

    @Override  
    protected void onCreate(Bundle savedInstanceState)  
    {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.activity_main);  

        handler.sendMessageDelayed(handler.obtainMessage(-1), 3000);  
    }  

    @Override  
    public boolean onTouchEvent(MotionEvent event)  
    {  

        if (event.getAction() == MotionEvent.ACTION_UP)  
        {  
            handler.sendMessage(handler.obtainMessage(-1));  
            finish();  
        }  

        return super.onTouchEvent(event);  
    }  

}  </pre><a style="text-indent:0px;" title="派生到我的代碼片" href="/misc/goto?guid=4959614367510692784" target="_blank"></a></div>

</div> </div> 也可以解決。

這里最后順便介紹一種比較另類的處理方式:

 
private Handler handler = new Handler()
{
public void handleMessage(android.os.Message msg)
{
Intent intent = new Intent(SplashActivity.this, MainActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
startActivity(intent);
finish();

    };  

}; </pre></div>


其余代碼和上面的代碼一樣,就去掉了移除消息的部分,添加了一個Intent的flag。當僅有這兩個Activity時是沒有問題的,感覺也可以。但是要明白FLAG_ACTIVITY_SINGLE_TOP的含義是,當此Activity存在且位于棧頂時復用,也就是說,3秒內用戶進入別的 Activity了,依然會發生重新進入的現象。

來自:http://blog.csdn.net/lmj623565791/article/details/23613403

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!