zoukankan      html  css  js  c++  java
  • Android Splash界面支持用户点击 直接进入主界面

    转载请注明出处:http://blog.csdn.net/lmj623565791/article/details/23613403

    现在大部分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了,依然会发生重新进入的现象。





    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    POJ 2752 Seek the Name, Seek the Fame
    POJ 2406 Power Strings
    KMP 算法总结
    SGU 275 To xor or not to xor
    hihocoder 1196 高斯消元.二
    hihoCoder 1195 高斯消元.一
    UvaLive 5026 Building Roads
    HDU 2196 computer
    Notions of Flow Networks and Flows
    C/C++代码中的笔误
  • 原文地址:https://www.cnblogs.com/dingxiaoyue/p/4924987.html
Copyright © 2011-2022 走看看