1. 程式人生 > >android SplashActivity的兩種寫法

android SplashActivity的兩種寫法

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

可以兩者綜合