先出一個題吧,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
詳見於幾張圖讓你明白Android四大啓動模式3d
詳見於Android事件分發機制,你瞭解過嗎?rest
這裏說一下爲何我要把這個模塊放在Activity
,明明這個機制涉及的有三方Activity
、ViewGroup
、View
。code
其實個人思考主要是由於Activity
是接受到這些動做的第一人,而不論是ViewGroup
仍是View
,都是後來通過一個事件的分發後,纔有的他們的處理,因此我將事件分發機制歸結於此。
在Activity
的跳轉之間,其實存在不少須要帶上數據的狀況。舉個例子來講,就像是從Activity A
一個新聞列表中選取了一條新聞,那這個時候就須要跳轉進入Activity B
,而查詢新聞的方式咱們就假設是他的id
那這個時候,就須要將這個id
從Activity 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);
}
複製代碼
你可能想說博主怎麼這麼多問題???哈哈哈哈哈!一塊兒來探討一下唄,反正我也剛想知道。
public Intent getIntent() {
return mIntent;
}
複製代碼
咱們去Activity
的startActivity(intent)
跳轉過程當中去查詢,固然代碼太多了,我就直接總結好了。
startActivity() --> startActivityForResult() --
--> Instrumentation.execStartActivity() --> IActivityTaskManager.startActivity() --
--> 進入了一個.aidl文件而後我也不知道了,可是確定是在這裏辦正事兒的
複製代碼
探索發現:
(1)咱們的數據,也就是Intent
中使用putExtra(key, value)
放置的數據最後都被封裝進了Bundle
,因此說Bundle
其實就是咱們Activity
之間數據傳遞的媒介。
(2)而Activity
的跳轉也是基於一個Binder
的機制來完成的,固然問我爲啥呢。我也只能說由於包裏找不到,基本上只會是.aidl
文件,而後結合之前看的網上的解析都是說基於Binder
的機制。
固然個人問題並無解決,等我之後知識儲備夠了再來分析一下底層。
其實上面都講的差很少了,這裏說一個實際會碰到的問題把。
就是static
、Handler
、ServiceConnection
這一類可能會引起的內存泄漏問題。他們存在解決方法,其實多種多樣,但更多通常也都是基於生命週期來完成的。通常解法都是在onDestroy()
進行置空操做、或是解綁這一類方法把。
以上就是個人學習成果,若是有什麼我沒有思考到的地方或是文章內存在錯誤,歡迎與我分享。
相關文章推薦: