android SplashActivity的兩種寫法
阿新 • • 發佈:2018-12-09
記錄SplashActivity的簡單用法,重要在思路
倒計時式(在UI顯示倒計時)
使用靜態處理和弱引用的方式防止記憶體洩漏
處理器的SendMessage函式傳送第一次訊息(索引)
之後再的handleMessage中接受並處理訊息(再次傳送,一個迴圈進行的)和UI更新
import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.TextView; import java.lang.ref.WeakReference; public class SplashActivity extends AppCompatActivity { public static final int CODE = 1001; public static final int TOTAL_TIME = 3000; public static final int INTERVAL_TIME = 1000; private TextView mTextView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_spash); mTextView = (TextView) findViewById(R.id.time_text_view); final MyHandler handler = new MyHandler(this); //第一次發訊息 Message message = Message.obtain(); message.what = CODE; message.arg1 = TOTAL_TIME; handler.sendMessage(message); mTextView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { BookListActivity.start(SplashActivity.this); SplashActivity.this.finish(); //如果點選跳過之後,要去掉這個message防止 //activity關閉後handler沒有被釋放掉 handler.removeMessages(CODE); } }); } /** 靜態Handler防止記憶體洩漏 **/ public static class MyHandler extends Handler { //弱引用 public final WeakReference<SplashActivity> mWeakReference; public MyHandler(SplashActivity activity) { mWeakReference = new WeakReference<>(activity); } //不斷的接收和處理訊息 @Override public void handleMessage(Message msg) { super.handleMessage(msg); SplashActivity activity = mWeakReference.get(); if (msg.what == CODE) { if (activity != null) { // 設定textview,更新UI int time = msg.arg1; activity.mTextView.setText(time/ INTERVAL_TIME +"秒,點選跳過"); // 傳送倒計時 Message message = Message.obtain(); message.what = CODE; message.arg1 = time - INTERVAL_TIME; if (time > 0) { sendMessageDelayed(message, INTERVAL_TIME); } else { BookListActivity.start(activity); activity.finish(); } } } } } }
定時式,內部實現,不再UI顯示倒計時
處理器的postdelayed方法
import android.content.Intent; import android.os.Handler; import android.support.v7.app.AppCompatActivity; import android.widget.Button; import com.demo.restaurant.R; import org.androidannotations.annotations.AfterViews; import org.androidannotations.annotations.Click; import org.androidannotations.annotations.EActivity; import org.androidannotations.annotations.ViewById; /** * 閃屏頁 * 1.等待3s進入login * 2.或者點選跳過進入login * 使用了AA註解 */ @EActivity(R.layout.activity_splash) public class SplashActivity extends AppCompatActivity { @ViewById(R.id.id_splash_btn) Button mBtnSkip; private Handler mHandler = new Handler(); private Runnable mRunnableToLogin = new Runnable() { @Override public void run() { toLoginActivity(); } }; /** * 定時事件 */ @AfterViews void toLoginEvent() { //3s後執行runnable mHandler.postDelayed(mRunnableToLogin, 3000); } /** * 點選事件 */ @Click(R.id.id_splash_btn) void mBtnSkip() { //如果點選跳過,要去掉定時任務,否則會出現兩次splash頁面 mHandler.removeCallbacks(mRunnableToLogin); toLoginActivity(); } /** * 跳轉到Login介面的方法 */ private void toLoginActivity() { startActivity(new Intent(this, LoginActivity_.class)); finish(); } /** * 防止handle記憶體洩漏 */ @Override protected void onDestroy() { super.onDestroy(); mHandler.removeCallbacks(mRunnableToLogin); } }
可以兩者綜合