亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

android中Activity詳解(生命周期、以各種方式啟動(dòng)Activity、狀態(tài)保存,完全退出等)

 更新時(shí)間:2016年11月29日 10:59:28   作者:tangcheng_ok  
本篇文章詳細(xì)的介紹了Activity,包括生命周期、以各種方式啟動(dòng)Activity、狀態(tài)保存,完全退出等,有興趣的可以了解一下。

一、什么是Activity?

簡(jiǎn)單的說(shuō):Activity就是布滿整個(gè)窗口或者懸浮于其他窗口上的交互界面。在一個(gè)應(yīng)用程序中通常由多個(gè)Activity構(gòu)成,都會(huì)在Manifestxml中指定一個(gè)主的Activity,如下設(shè)置

<actionandroid:name="AndroidintentactionMAIN" />

當(dāng)程序第一次運(yùn)行時(shí)用戶就會(huì)看這個(gè)Activity,這個(gè)Activity可以通過(guò)啟動(dòng)其他的Activity進(jìn)行相關(guān)操作。當(dāng)啟動(dòng)其他的Activity時(shí)這個(gè)當(dāng)前的這個(gè)Activity將會(huì)停止,新的Activity將會(huì)壓入棧中,同時(shí)獲取用戶焦點(diǎn),這時(shí)就可在這個(gè)Activity上操作了。都知道棧是先進(jìn)后出的原則,那么當(dāng)用戶按Back鍵時(shí),當(dāng)前的這個(gè)Activity銷(xiāo)毀,前一個(gè)Activity重新恢復(fù)。

二、Activity生命周期

先看下圖:

這個(gè)圖不再多說(shuō)什么,下面我們通過(guò)一個(gè)實(shí)例來(lái)說(shuō)明問(wèn)題。新建工程,編寫(xiě)如下代碼:

<span style="font-size: 18px;">package comandroidttxactiitylifedemo; 
import androidappActivity; 
import androidosBundle; 
import androidutilLog; 
import androidviewKeyEvent; 
public class ActivityLifeDemo extends Activity { 
  private final static String TAG="ActivityLifeDemo"; 
   
  @Override 
  public void onCreate(Bundle savedInstanceState) { 
    superonCreate(savedInstanceState); 
    setContentView(Rlayoutmain); 
     
    Logi(TAG, "onCreate"); 
  } 
  @Override 
  protected void onStart() { 
    Logi(TAG, "onStart"); 
    superonStart(); 
  } 
  @Override 
  protected void onRestart() { 
    Logi(TAG, "onRestart"); 
    superonRestart(); 
  } 
  @Override 
  protected void onResume() { 
    Logi(TAG, "onResume"); 
    superonResume(); 
  } 
  @Override 
  protected void onPause() { 
    Logi(TAG, "onPause"); 
    superonPause(); 
  } 
  @Override 
  protected void onStop() { 
    Logi(TAG, "onStop"); 
    superonStop(); 
  } 
  @Override 
  protected void onDestroy() { 
    Logi(TAG, "onDestroy"); 
    superonDestroy(); 
  } 
} 
</span> 

代碼很簡(jiǎn)單,只涉及到一個(gè)Activity,一些用戶的操作,我們通過(guò)記錄操作和打印日志的方式來(lái)看看Activity的生命周期過(guò)程。

1、  運(yùn)行

看到如下打印日志:

08-31 08:46:916: INFO/ActivityLifeDemo(312): onCreate
08-31 08:46:916: INFO/ActivityLifeDemo(312): onStart
08-31 08:46:916: INFO/ActivityLifeDemo(312): onResume

2、按下返回按鍵:

08-31 09:29:396: INFO/ActivityLifeDemo(354): onPause
08-31 09:29:216: INFO/ActivityLifeDemo(354): onStop
08-31 09:29:216: INFO/ActivityLifeDemo(354): onDestroy

3、長(zhǎng)按Home鍵,彈出最近打開(kāi)過(guò)的應(yīng)用程序,點(diǎn)擊ActivityLifeDemo

08-31 08:51:916: INFO/ActivityLifeDemo(312): onCreate
08-31 08:51:916: INFO/ActivityLifeDemo(312): onStart
08-31 08:51:936: INFO/ActivityLifeDemo(312): onResume

4、按Home鍵

08-31 08:53:676: INFO/ActivityLifeDemo(312): onPause
08-31 08:53:796: INFO/ActivityLifeDemo(312): onStop

5、在AllList中點(diǎn)擊打開(kāi)

08-31 08:54:286: INFO/ActivityLifeDemo(312): onRestart
08-31 08:54:286: INFO/ActivityLifeDemo(312): onStart
08-31 08:54:296: INFO/ActivityLifeDemo(312): onResume

通過(guò)日志信息,我們可以看到。Activity的啟動(dòng)過(guò)程:onCreate—onStart—onResume;下返回鍵時(shí):onPause—onStop—onDestroy 正如上面說(shuō)是,當(dāng)按下返回鍵時(shí),此Activity彈出棧,程序銷(xiāo)毀。確實(shí)如此,我們?cè)俅?打開(kāi)時(shí)的啟動(dòng)過(guò)程又回到onCreate—onStart—onResume。OK,啟動(dòng)之后按下Home鍵,回到Launcher,查看打印信息:onPause—onStop,再次打開(kāi)的運(yùn)行過(guò)程:onRestart—onStart—onResume。

我們通過(guò)對(duì)Activity的各種操作,構(gòu)成了Activity的生命周期,我們看到無(wú)論對(duì)Activity做如何的操作,都會(huì)接收到相關(guān)的回調(diào)方法,那么我們?cè)陂_(kāi)發(fā)的過(guò)程中通過(guò)這些回調(diào)方法就可以寫(xiě)工作,比如說(shuō)釋放一些重量級(jí)的對(duì)象,網(wǎng)絡(luò)連接,數(shù)據(jù)庫(kù)連接,文件讀等等。

以下是各個(gè)方法的詳細(xì)說(shuō)明:

onCreate():當(dāng) activity 第一次創(chuàng)建時(shí)會(huì)被調(diào)用。在這個(gè)方法中你需要完成所有的正常靜態(tài)設(shè)置 ,比如創(chuàng)建一個(gè)視圖( view )、綁定列表的數(shù)據(jù)等等。如果能捕獲到 activity 狀態(tài)的話,這個(gè)方法傳遞進(jìn)來(lái)的 Bundle 對(duì)象將存放了 activity 當(dāng)前的狀態(tài)。調(diào)用該方法后一般會(huì)調(diào)用 onStart() 方法。

onRestart():在 activity 被停止后重新啟動(dòng)時(shí)會(huì)調(diào)用該方法。其后續(xù)會(huì)調(diào)用 onStart 方法。

onStart()à當(dāng) activity 對(duì)于用戶可見(jiàn)前即調(diào)用這個(gè)方法。如果 activity回到前臺(tái)則接著調(diào)用 onResume() ,如果 activity 隱藏則調(diào)用onStop()

onResume():在 activity 開(kāi)始與用戶交互前調(diào)用該方法。在這時(shí)該activity 處于 activity 棧的頂部,并且接受用戶的輸入。其后續(xù)會(huì)調(diào)用 onPause() 方法。

onPause():在系統(tǒng)準(zhǔn)備開(kāi)始恢復(fù)其它 activity 時(shí)會(huì)調(diào)用該方法。這個(gè)方法中通常用來(lái)提交一些還沒(méi)保存的更改到持久數(shù)據(jù) 中,停止一些動(dòng)畫(huà)或其它一些耗 CPU 的操作等等。無(wú)論在該方法里面進(jìn)行任何操作,都需要較快速完成,因?yàn)槿绻环祷氐脑?,下一個(gè) activity 將無(wú)法恢復(fù)出來(lái)。如果 activity 返回到前臺(tái)將會(huì)調(diào)用 onResume() ,如果 activity 變得對(duì)用戶不可見(jiàn)了將會(huì)調(diào)用onStop() 。

onStop():在 activity 對(duì)用戶不可見(jiàn)時(shí)將調(diào)用該方法??赡軙?huì)因?yàn)楫?dāng)前 activity 正在被銷(xiāo)毀,或另一個(gè) activity (已經(jīng)存在的activity 或新的 activity )已經(jīng)恢復(fù)了正準(zhǔn)備覆蓋它,而調(diào)用該方法。如果 activity 正準(zhǔn)備返回與用戶交互時(shí)后續(xù)會(huì)調(diào)用onRestart ,如果 activity 正在被釋放則會(huì)調(diào)用 onDestroy 。

onDestroy():在 activity 被銷(xiāo)毀前會(huì)調(diào)用該方法。這是 activity 能接收到的最后一個(gè)調(diào)用??赡軙?huì)因?yàn)橛腥苏{(diào)用了 finish 方法使得當(dāng)前activity 正在關(guān)閉,或系統(tǒng)為了保護(hù)內(nèi)存臨時(shí)釋放這個(gè) activity的實(shí)例,而調(diào)用該方法。你可以用 isFinishing 方法來(lái)區(qū)分這兩種不同的情況。

三、如何啟動(dòng)一個(gè)新的Activity?

要啟動(dòng)一個(gè)新的Activity,我們可以通過(guò)調(diào)用Context中的startActivity來(lái)啟動(dòng)。像這樣:

<span style="font-size: 18px;">Intent intent = new Intent(this, ActivityDemoclass); 
startActivity(intent); // ActivityDemo是需要啟動(dòng)的Activity類(lèi) 
</span> 

通過(guò)上面的方法可以啟動(dòng)新的Activity了,但如果我要從當(dāng)前的Activity中傳遞數(shù)據(jù)到新的Activity呢?很簡(jiǎn)單:

<span style="font-size: 18px;">Intent intent = new Intent(this,ActivityDemoclass); 
Bundle bundle = new Bundle(); 
bundleputBoolean("bool_key", true); 
intentputExtras(bundle); 
startActivity(intent); 
</span> 

還有,有時(shí)候我們需要啟動(dòng)帶返回值的Activity,簡(jiǎn)單的說(shuō)就是需要新啟動(dòng)的Activity返回時(shí)將值傳遞給啟動(dòng)它的Activity,像這樣:

<span style="font-size: 18px;">Intent intent = new Intent(ActivityLifeDemothis,RevalueActivityclass); 
startActivityForResult(intent, 0x1001); 
</span> 

ActivityLifeDemo是當(dāng)前的Activity,啟動(dòng)RevalueActivity,我們?cè)贏ctivityLifeDemo中需要獲取RevalueActivity傳回來(lái)的值。那么在RevalueActivity中就必須這樣寫(xiě):

<span style="font-size: 18px;">Intent intent = new Intent(); 
intentputExtra("revalue_key","haha-revalueActivity"); 
setResult(0x1001, intent);</span> 

那么“revalue_key”值在哪里獲取呢?必須重寫(xiě)onActivityResult方法,通過(guò)判斷requestCode,來(lái)確定

<span style="font-size: 18px;">if(requestCode==0x1001){ 
      String str = datagetStringExtra("revalue_key"); 
      Logi(TAG, "返回的值為:"+str); 
    } 
</span> 

好了,詳細(xì)的請(qǐng)看代碼吧。下載地址:http://xiazai.jb51.net/201611/yuanma/ActivityLifeDemo_jb51.rar

 四、保存Activity運(yùn)行狀態(tài)

通過(guò)重寫(xiě)onSaveInstanceState()方法來(lái)實(shí)現(xiàn)Activity的運(yùn)行狀態(tài),請(qǐng)注意以下幾點(diǎn):

1)由于activity 對(duì)象被暫停或停止時(shí),它仍然保留在內(nèi)存里面,關(guān)于它的成員信息和當(dāng)前狀態(tài)都是活動(dòng)的,所以此時(shí)可以保存Activity的狀態(tài),從而使用戶所作的Activity的更改保存在內(nèi)存中

2)  當(dāng)系統(tǒng)回收內(nèi)存而將Activity銷(xiāo)毀時(shí),就無(wú)法保存其狀態(tài),所以需要調(diào)用onSaveInstanceState()方法來(lái)實(shí)現(xiàn)狀態(tài)的保存

3)  很多情況并不需要保持狀態(tài)信息,比如按下返回鍵直接關(guān)閉程序,所以并不能保證會(huì)調(diào)用onSaveInstanceState。如果調(diào)用了該方法,一般是在onStop 方法之前且可能在 onPause 之后調(diào)用。盡管如此,即使你沒(méi)做任何操作或沒(méi)有實(shí)現(xiàn) onSaveInstanceState() 方法,你的 activity 狀態(tài)也能通過(guò)Activity 類(lèi)里面默認(rèn)實(shí)現(xiàn)的 onSaveInstanceState 方法恢復(fù)出來(lái)。特別是會(huì)為布局中的視圖( View )默認(rèn)調(diào)用onSaveInstanceState 方法,并在這個(gè)方法中允許每一個(gè)視圖提供它需要恢復(fù)的任何信息。幾乎每一個(gè) Android框架中的 widget 都視情況實(shí)現(xiàn)了這個(gè)方法。

注:因?yàn)?onSaveInstanceState 方法不一定會(huì)被調(diào)用,所以你應(yīng)該只是用它來(lái)保存一些 activity 的轉(zhuǎn)換過(guò)程狀態(tài)(即 UI 的狀態(tài)),而不能用來(lái)保存永久性數(shù)據(jù)。但你可以用 onPause 方法在用戶離開(kāi) activity 時(shí)來(lái)保存永久性數(shù)據(jù),比如需要保存到數(shù)據(jù)庫(kù)的數(shù)據(jù)。

有一個(gè)很好的方法可以用來(lái)檢驗(yàn)應(yīng)用程序保存狀態(tài)的能力,就是簡(jiǎn)單地旋轉(zhuǎn)你的設(shè)備來(lái)改變屏幕的方向。因?yàn)楫?dāng)屏幕方向改變時(shí),系統(tǒng)為了給新的方向提供一個(gè)可能合適的代替資源,會(huì)銷(xiāo)毀 activity 并新建一個(gè)新的。由于這個(gè)原因,你的 activity 是否能在其重新創(chuàng)建時(shí)完成保存狀態(tài)就顯得尤為重要,因?yàn)橛脩艚?jīng)常會(huì)在使用應(yīng)用程序時(shí)旋轉(zhuǎn)屏幕的。

五、完全退出程序

通過(guò)上面的介紹,我們知道當(dāng)點(diǎn)擊back鍵時(shí),程序調(diào)用了onDestroy方法,程序退出了,但是我們查看其進(jìn)程,發(fā)現(xiàn)調(diào)用了onDestroy方法之后這個(gè)Activity還在運(yùn)行。甚至調(diào)用了finish()方法之后程序還能在進(jìn)程中看到。通過(guò)下面這種方式可以實(shí)現(xiàn)程序的完全退出:

<span style="font-size: 18px;">Intent intent = new Intent(); 
IntentsetClass(context,MainActivityclass); 
intentsetFlags(IntentFLAG_ACTIVITY_CLEAR_TOP); 
intentputExtra(“flag”,EXIT_APPLICATION); 
contextstartActivity(intnet);  
</span> 

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

最新評(píng)論