Android启动界面之SplashActivity的设计
16lz
2021-01-25
本来觉得Android应用的启动界面就几秒钟,也就显示一张图片,判断一下用户是不是第一次使用,如果第一次使用就在进入主界面之前先进入引导界面,否则直接进入主界面,如果还想从服务器加载图片在UI线程中干也没太大问题,怎么说几行也就搞定了,但是,但是我竟然手贱的写了近130行,主要是进行了载入时间的判断、点击直接进入等操作,下面是源码:
public class SplashActivity extends Activity { private static final int SHOW_TIME_MIN = 3000; private static long mStartTime; private static boolean isFirstUse; private boolean isLoadingFinished; private Handler mHandler = new SplashActivityHandler(this); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_splash); mStartTime = System.currentTimeMillis(); startLoadingTask(); } @Override public boolean onTouchEvent(MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_UP) { if (isLoadingFinished) { mHandler.sendMessage(mHandler.obtainMessage(2)); } } return super.onTouchEvent(event); } private void startLoadingTask() { new LoadingTask().execute(); } private class LoadingTask extends AsyncTask<Void, Void, Void> { @Override protected void onPreExecute() { super.onPreExecute(); } @Override protected void onPostExecute(Void aVoid) { super.onPostExecute(aVoid); isLoadingFinished = true; mHandler.sendMessage(mHandler.obtainMessage(1)); } @Override protected Void doInBackground(Void... params) { SharedPreferences preferences = getSharedPreferences("user", Context.MODE_PRIVATE); isFirstUse = preferences.getBoolean("isFirstUse", true); try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } return null; } } private static class SplashActivityHandler extends Handler { WeakReference<SplashActivity> splashActivityWeakReference; SplashActivityHandler(SplashActivity splashActivity) { splashActivityWeakReference = new WeakReference<SplashActivity>(splashActivity); } @Override public void handleMessage(android.os.Message msg) { switch (msg.what) { case 1: long loadingTime = System.currentTimeMillis() - mStartTime; if (loadingTime < SHOW_TIME_MIN) { postDelayed(switchActivity, SHOW_TIME_MIN - loadingTime); } else { post(switchActivity); } break; case 2: if (switchActivity != null) { removeCallbacks(switchActivity); } post(switchActivity); break; default: break; } removeMessages(1); } Runnable switchActivity = new Runnable() { @Override public void run() { if (isFirstUse) { SplashActivity splashActivity = splashActivityWeakReference.get(); SharedPreferences preferences = splashActivity.getSharedPreferences("user", Context.MODE_PRIVATE); SharedPreferences.Editor editor = preferences.edit(); editor.putBoolean("isFirstUse", false); editor.commit(); splashActivity.startActivity(new Intent(splashActivity, GuideActivity.class)); splashActivity.finish(); } else { SplashActivity splashActivity = splashActivityWeakReference.get(); splashActivity.startActivity(new Intent(splashActivity, MainActivity.class)); splashActivity.finish(); } } }; }}其中,利用线程睡眠5s来模仿访问服务器的耗时操作,如果时间短了会延时到3s进入(此时可以点击页面直接进入)。如果时间长了,例如10s,那么10s才进入。
如果代码有问题,还望各位指出,我好学习一下。
更多相关文章
- Android(安卓)和H5之间的交互-框架篇
- Android进阶知识树——Android消息队列
- Android基于IIS的APK下载(四)数据下载
- iOS学习计划——轻松开心慢慢来
- Android实现通用的ActivityGroup(效果类似Android微博客户端主界
- Android的Handler机制
- 将app变为桌面程序,开机后不再显示原桌面,而是显示我们的app界面
- Android开发之天气预报(四)UI界面实现
- Android参考书籍