Activity知識總結

Activity生命週期

  1. 運行狀態:可見,並且可操作
    (onCreate--onStart---onResume)
    (onRestart--onStart---onResume)
  2. 暫停狀態:可見,但是不可操作 onPause
  3. 停止狀態:不可見,並且也不可操作 onStop
  4. 銷燬狀態:該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啓動方法

  1. 通過startActivity(Intent intent)啓動Activity。
    傳遞參數的方式:putExtra("key",values);
    或者putExtras(Bundle);
    獲取參數的方式:getXxxExtra(key)
     或者getExtras().getXxx()
     注意:Xxx是數據類型
  2. 通過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四種加載模式

  1. standard 默認
    不管Activity實例是否存在,
    都會創建一個新的實例裝入Task。

    (每次通過這種模式來啓動目標Activity時,

    android總會爲目標Activity創建一個新的實例,
    並將該Activity添加到目前的Task棧中,
    這種模式不會啓動新的Task,新的Activity將被添加到原有的Task中)
    例子:10個應用程序都要調用瀏覽器的應用,
    那麼你需要創建10個瀏覽器對象的Activity的對象嗎?

  2. singleTop 棧頂單例 --->微薄刷新
    被跳轉的Activity位於Task頂部時:
    不會創建新的實例,直接複用已有的Activity實例
    被跳轉的Activity不是位於頂部時:
    創建一個新的實例,同standard模式相似

  3. singleTask 棧內單例:在同一個Task內只有一個實例
    採用這種模式分三種情況:

     a)如果將要啓動的目標Activity不存在,系統將會創建目標Activity的實例,並將它加入Task棧頂。  
     b)如果將要啓動的目標Activity已經位於Task棧頂,此時同singleTop模式

    a)如果將要啓動的目標Activity沒有位於Task棧頂,系統將會把位於該Activity上面的所有Activity移除Task棧,從而使得目標Activity轉入棧頂。

  4. singleInstance 全局單例模式
    採用這種模式啓動目標Activity時,可分爲如下兩種情況:

     a)如果將要啓動的目標Activity不存在,系統會先創建一個全新的Task,在創建目標Activity的實例,

    並將它加入新的Task的棧頂。

     b)如果將要啓動的目標Activity已經存在,無論它位於哪個應用程序中,無論它位於哪個Task中,

    系統會把該Activity所在的Task轉到前臺,從而使用該Activity顯示出來。

    需要指出:採用單例模式加載Activity總是位於Task棧頂,
    採用單例模式加載Activity所在Task只包含該Activity
發佈了456 篇原創文章 · 獲贊 19 · 訪問量 42萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章