Android必知必會的四大組件 -- Activity篇

前言

先出一個題吧,Activity A 跳轉Activity B,再從Activity B按back鍵回退,兩個過程各自的生命週期?java

這是一個比較簡單的生命週期問題,可是不少人會答錯。那咱們就對整個生命週期進行一個分析,再給出答案好了。而且文章內有一些內容我已經寫過了,都是經過給出連接方式跳轉查看了,請見諒。bash

思惟導圖

生命週期

這兒重點要知道的是下面這兩對各自之間的區別的區別。ide

(1)onPause()onStop()post

(2)onStart()onResume()學習

onPause()說明當前的Activity已經暫停,但你並非說暫停的意思只是沒有了動做,而調用了onStop()才讓Acivity不可見。onStart()也是同樣,只是說Activity已經能夠啓動了,但這個時候頁面仍是不可見的,只有調用了onResume()頁面纔可以可見,頁面跳轉也是如此。this

如今在回答一下以前的問題,Activity A 跳轉Activity B,再從Activity B按back鍵回退,兩個過程各自的生命週期?spa

  1. Activity A 跳轉Activity B: Apause -> Bcreate -> Bstart -> Bresume -> Astop
  2. Activity B再按back鍵回退: Bpause -> Arestart -> Astart -> Aresume -> Bstop -> Bdestroy

啓動模式

詳見於幾張圖讓你明白Android四大啓動模式3d

事件分發機制

詳見於Android事件分發機制,你瞭解過嗎?rest

這裏說一下爲何我要把這個模塊放在Activity,明明這個機制涉及的有三方ActivityViewGroupViewcode

其實個人思考主要是由於Activity是接受到這些動做的第一人,而不論是ViewGroup仍是View,都是後來通過一個事件的分發後,纔有的他們的處理,因此我將事件分發機制歸結於此。

Activity之間的數據傳輸

Activity的跳轉之間,其實存在不少須要帶上數據的狀況。舉個例子來講,就像是從Activity A一個新聞列表中選取了一條新聞,那這個時候就須要跳轉進入Activity B,而查詢新聞的方式咱們就假設是他的id那這個時候,就須要將這個idActivity A送到Activity B中。

其實這種方式有不少,可是最廣泛進行使用的莫過於putExtra(key, value)了。

使用方法

// 1. 定義跳轉頁面
Intent intent = new Intent(this, SecActivity.class);
// 2. 將數據放到Intent中
intent.putExtra("parameter key", "parameter value");
// 3. 啓動頁面
// |-- 不帶回傳方法
startActivity(intent);
// |-- 帶回傳方法
startActivityForResult(intent, REQUEST_CODE);
複製代碼

這裏要注意的一個問題就是,若是想要接受到返回的數據,那咱們就存在必須重寫的方法,經過下方模版便可完成。

@Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        if(requestCode == REQUEST_CODE){
            // 進行相應的處理
        }
        super.onActivityResult(requestCode, resultCode, data);
    }
複製代碼

完成了頁面跳轉和參數傳遞,那咱們接下來要幹啥?固然是拿到這些參數了!!!

getIntent().getStringExtra(key);
getIntent().getBooleanExtra(key);
// 。。。。。。
複製代碼

實在太多了,我就不一一列舉了。那咱們就出現問題了getIntent()哪兒來的,傳遞靠的是什麼機制??,由於咱們的接收還沒講完,因此咱們這個問題先保留。

由於咱們說過一個事情存在回調,咱們應該要怎麼作的問題。

// 經過setRsult()方法,來進行一個數據的回傳
setResult(resultCode);
setResult(resultCode, intent);

// 模版,setResult()方法二選一
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
        // 說明是一個返回事件
        if (keyCode == KeyEvent.ACTION_DOWN && event.getAction() == KeyEvent.ACTION_DOWN) {
            Intent intent = new Intent();
            intent.putExtra("parameter key", "parameter value");
            // setResult(resultCode);
            setResult(resultCode, intent);
        }

        return super.onKeyDown(keyCode, event);
    }
複製代碼

Activity之間跳轉,Intent的設置

你可能想說博主怎麼這麼多問題???哈哈哈哈哈!一塊兒來探討一下唄,反正我也剛想知道。

public Intent getIntent() {
        return mIntent;
    }
複製代碼

咱們去ActivitystartActivity(intent)跳轉過程當中去查詢,固然代碼太多了,我就直接總結好了。

startActivity() --> startActivityForResult() --
--> Instrumentation.execStartActivity() --> IActivityTaskManager.startActivity() --
--> 進入了一個.aidl文件而後我也不知道了,可是確定是在這裏辦正事兒的
複製代碼

探索發現:

(1)咱們的數據,也就是Intent中使用putExtra(key, value)放置的數據最後都被封裝進了Bundle,因此說Bundle其實就是咱們Activity之間數據傳遞的媒介。

(2)而Activity的跳轉也是基於一個Binder的機制來完成的,固然問我爲啥呢。我也只能說由於包裏找不到,基本上只會是.aidl文件,而後結合之前看的網上的解析都是說基於Binder的機制。

固然個人問題並無解決,等我之後知識儲備夠了再來分析一下底層。

總結

其實上面都講的差很少了,這裏說一個實際會碰到的問題把。

就是staticHandlerServiceConnection這一類可能會引起的內存泄漏問題。他們存在解決方法,其實多種多樣,但更多通常也都是基於生命週期來完成的。通常解法都是在onDestroy()進行置空操做、或是解綁這一類方法把。

以上就是個人學習成果,若是有什麼我沒有思考到的地方或是文章內存在錯誤,歡迎與我分享。


相關文章推薦:

Android必知必會的四大組件 -- Broadcast Receiver篇

Android必知必會的四大組件 -- Service篇

Glide都在用的LruCache,你會幾分?

相關文章
相關標籤/搜索