Android的Splash界面支持用户点击

来源:互联网 发布:双11淘宝c店发货时间 编辑:程序博客网 时间:2024/06/05 15:00

一、Splash使用背景

现在大部分APP都有Splash界面,下面列一下Splash页面的几个作用:
1、展示logo,提高公司形象
2、初始化数据 (拷贝数据到SD)
3、提高用户体验
4、连接服务器是否有新的版本等。

二、样例

1、使用Splash的一般方式

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

2、假如现在想实现点击Splash界面的图片,跳转到指定界面
再添加如下代码:

 @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、存在重复跳转到MainActivity界面的问题

二、改进

1、使用Runnable对象

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

2、使用message消息,因为removeMessages()方法必须要传入一个int值,所以任意取值为-1

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

0 0