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);  
    }  

}  

现在我们添加个用户触摸屏幕直接进入主界面:

@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);  
} 

然后测试,会发现用户如果直接触摸进入,当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);  
    }  
}

定义了个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);  
    }  

}  

也可以解决。
这里最后顺便介绍一种比较另类的处理方式:

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();  

    };  

};  

其余代码和上面的代码一样,就去掉了移除消息的部分,添加了一个Intent的flag。当仅有这两个Activity时是没有问题的,感觉也可以。但是要明白FLAG_ACTIVITY_SINGLE_TOP的含义是,当此Activity存在且位于栈顶时复用,也就是说,3秒内用户进入别的Activity了,依然会发生重新进入的现象。

转载:http://blog.csdn.net/lmj623565791/article/details/23613403

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值