Activity生命週期
- 運行狀態:可見,並且可操作
(onCreate--onStart---onResume)(onRestart--onStart---onResume)
- 暫停狀態:可見,但是不可操作 onPause
- 停止狀態:不可見,並且也不可操作 onStop
- 銷燬狀態:該Activity結束,或Activity所在的Dalivik進程被結束 onDestory
回調函數
- onCreate():Activity在實例化過程被調用,進行創建工作,只會調用一次. (一般創建界面,做一些數據的初始化工作)
- onStart():Activity啓動過程的回調函數,可見
- onResume():恢復Activity時被回調,onStart()方法後一定會回調該方法,可操作
- onPause():暫停Activity時被回調(Activity失去操作焦點,但可見)
<span style="font-size:14px;">系統會停止動畫等消耗CPU的事情。 應該在這裏保存你的一些數據,因爲這個時候你的程序的優先級降低, 有可能被系統收回。在這裏保存的數據,應該在onResume裏讀出來。</span>
- onStop():停止Activity時被回調(Activity失去操作焦點,不可見)
- onDestory():銷燬Activity時被回調,該方法只會被調用一次(回收資源)
<span style="font-size:14px;"> 這是Activity被kill前最後一個被調用方法了。</span>
Activity啓動方法
- 通過startActivity(Intent intent)啓動Activity。
傳遞參數的方式:putExtra("key",values);
或者putExtras(Bundle);
獲取參數的方式:getXxxExtra(key)或者getExtras().getXxx() 注意:Xxx是數據類型
-
通過startActivityForResult(Intent intent,int requestCode):
( 以指定的請求碼啓動Activity,而且程序將會等待新啓動Activity的結果。
一般情況下,我們只需要保證requestCode>-1即可,
這樣它都能收到result。但是如果在A activity中,
能夠跳轉到多個activiity,並且要接受到這多個
activity中的信息的時候,我們就要注意了,這時候,
requestCode就起大作用了,當你startActiviityForResult()的時候,
給每一個不同的activity一個獨立的requestcode,
那麼在你接受到result的時候就可以通過這個參數來判斷,
結果是那個acitivity返回來的了)啓動的Activity重寫onActivityResult()
被啓動的Activity返回數據:setResult(int,Intent)
那麼setResult()應該在什麼時候調用呢?從源碼可以看出,
Activity返回result是在被finish的時候,也就是說調用
setResult()方法必須在finish()之前。所以在
onPause、onStop、onDestroy方法中調用setResult()也
有可能不會返回成功,因爲這些方法調用不一定是在
finish之前的,當然在onCreate()就調用setResult肯定
是在finish之前的,但是又不滿足業務需要。
實際使用場景有兩個:
(1)按BACK鍵從一個Activity退出來的,一按BACK,
android就會自動調用Activity的finish()方法,
方法:重寫onBackPressed()方法,捕獲BACK事件,
捕獲到之後先setResult。代碼:
@Override public void onBackPressed()
{
Log.i(TAG, "onBackPressed");
setResult(Const.LIVE_OK);
super.onBackPressed();
}
(2)按點擊事件中顯式的調用finish()
intent.putExtra("result",et.getText().toString());setResult(RESULT_OK, intent);finish();
Activity四種加載模式
-
standard 默認
不管Activity實例是否存在,
都會創建一個新的實例裝入Task。(每次通過這種模式來啓動目標Activity時,
android總會爲目標Activity創建一個新的實例,
並將該Activity添加到目前的Task棧中,
這種模式不會啓動新的Task,新的Activity將被添加到原有的Task中)
例子:10個應用程序都要調用瀏覽器的應用,
那麼你需要創建10個瀏覽器對象的Activity的對象嗎? -
singleTop 棧頂單例 --->微薄刷新
被跳轉的Activity位於Task頂部時:
不會創建新的實例,直接複用已有的Activity實例
被跳轉的Activity不是位於頂部時:
創建一個新的實例,同standard模式相似 -
singleTask 棧內單例:在同一個Task內只有一個實例
採用這種模式分三種情況:a)如果將要啓動的目標Activity不存在,系統將會創建目標Activity的實例,並將它加入Task棧頂。 b)如果將要啓動的目標Activity已經位於Task棧頂,此時同singleTop模式
a)如果將要啓動的目標Activity沒有位於Task棧頂,系統將會把位於該Activity上面的所有Activity移除Task棧,從而使得目標Activity轉入棧頂。
-
singleInstance 全局單例模式
採用這種模式啓動目標Activity時,可分爲如下兩種情況:a)如果將要啓動的目標Activity不存在,系統會先創建一個全新的Task,在創建目標Activity的實例,
並將它加入新的Task的棧頂。
b)如果將要啓動的目標Activity已經存在,無論它位於哪個應用程序中,無論它位於哪個Task中,
系統會把該Activity所在的Task轉到前臺,從而使用該Activity顯示出來。
需要指出:採用單例模式加載Activity總是位於Task棧頂, 採用單例模式加載Activity所在Task只包含該Activity