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了,依然會發生重新進入的現象。
來自: http://blog.csdn.net//lmj623565791/article/details/23613403
本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!