Activity詳細講解

一 Activity的生命週期
二 讓Activity變成一個窗口:Activity屬性設定
三 你後臺的Activity被系統 回收怎麼辦:onSaveInstanceState
四 調用與被調用:咱們的通訊使者 - Intent


一 Activity的生命週期
html

   和其餘手機 平臺應用 程序 同樣,Android的應用程序 的生命週期是被統一掌控 的,也
   就是說咱們寫的應用程序命運掌握在別人(系統)的手裏,咱們不能改變它,只能學習
   適應它。



簡單地說一下爲何是這樣:咱們手機在運行 一個應用程序的時候,有可能打進來電話
   發進來短信 ,或者沒有電了,這時候程序都會被中斷,優先去服務電話的基本功能 ,另
   外系統也不容許你佔用太多資源 ,至少要保證電話功能吧,因此資源不足的時候也就有可  
   能被幹掉。

   言歸正傳,Activity的基本生命週期以下代碼 所示:
android


Java 代碼
數據庫

  • public
    class MyActivity extends Activity {  多線程

  •     protected
    void onCreate(Bundle savedInstanceState);  架構


  •     protected
    void onStart();  ide


  •     protected
    void onResume();  學習


  •     protected
    void onPause();  動畫


  •     protected
    void onStop();  this


  •     protected
    void onDestroy();  google

  •   }   


public class MyActivity extends Activity {     protected void onCreate(Bundle savedInstanceState);     protected void onStart();     protected void onResume();     protected void onPause();     protected void onStop();     protected void onDestroy();   }

   你本身寫的Activity會按須要 重載這些方法,onCreate是免不了的,在一個Activity正常啓動的過程當中,他們被調用的順序是 onCreate -> onStart -> onResume, 在Activity被幹掉的時候順序是onPause -> onStop -> onDestroy ,這樣就是一個完整的生命週期,可是有人問了 ,程序正運行着呢來電話了,這個程序咋辦?停止了唄,若是停止的時候新出的一個Activity是全屏的那麼:onPause->onStop ,恢復的時候onStart->onResume ,若是打斷  這個應用程序的是一個Theme爲Translucent 或者Dialog 的Activity那麼只是onPause ,恢復 的時候onResume

   詳細介紹一下這幾個方法中系統在作什麼以及咱們應該作什麼:

   onCreate:   在這裏建立界面 ,作一些數據 的初始化工做

   onStart:    到這一步變成用戶可見不可交互

   onResume:   變成和用戶可交互 的,(在activity 棧系統經過棧的方式管理這些個      
                      Activity的最上面,運行完彈出棧,則回到上一個Activity)

   onPause:     到這一步是可見但不可交互 的,系統會中止動畫 等消耗CPU 的事情
                    從上文的描述已經知道,應該在這裏保存你的一些數據,由於這個時候
                    你的程序的優先級下降,有可能被系統收回。在這裏保存的數據,應該在

                    onResume裏讀出來,注意:這個方法裏作的事情時間要短,由於下一
                    個activity不會等到這個方法完成才啓動

   onstop:     變得不可見 ,被下一個activity覆蓋了

   onDestroy: 這是activity被幹掉前最後一個被調用方法了,多是外面類調用finish方
                     法或者是系統爲了節省空間將它暫時性的幹掉,能夠用isFinishing()來判
                     斷它,若是你有一個Progress Dialog在線程中轉動,請在onDestroy裏
                     把他cancel掉,否則等線程結束的時候,調用Dialog的cancel方法會拋
                     異常的。

              
onPause,onstop, onDestroy,三種狀態 下 activity都有可能被系統幹掉
爲了保證程序的正確性,你要在onPause()裏寫上持久層操做的代碼,將用戶編輯的內容都保存到存儲介質上(通常都是數據庫 )。實際工做中由於生命週期的變化而帶來的問題也不少,好比你的應用程序起了新的線程在跑,這時候中斷了,你還要去維護那個線程,是暫停仍是殺掉仍是數據回滾,是吧?由於Activity可能被殺掉,因此線程中使用的變量和一些界面元素就千萬要注意了,通常我都是採用Android的消息機制 [Handler,Message]來處理多線程和界面交互的問題。這個我後面會講一些,最近由於這些東西頭已經很大了,等我理清思緒再跟你們分享。

二 讓Activity變成一個窗口:Activity屬性設定
   
   講點輕鬆的吧,可能有人但願作出來的應用程序是一個漂浮在手機主界面的東西,那麼很
簡單你只須要設置 一下Activity的主題就能夠了在AndroidManifest.xml 中定義 Activity的
地方一句話:


Xml代碼

  • android :theme="@android :style/Theme.Dialog"


android:theme="@android :style/Theme.Dialog"


這就使你的應用程序變成對話框的形式彈出來了,或者


Xml代碼

  • android:theme="@android :style/Theme.Translucent"


android:theme="@android :style/Theme.Translucent"

就變成半透明的,[友情提示-.-]相似的這種activity的屬性能夠在android.R.styleable 類的AndroidManifestActivity 方法中看到,AndroidManifest.xml中全部元素的屬性的介紹均可以參考這個類android.R.styleable

上面說的是屬性名稱,具體有什麼值是在android.R.style中 能夠看到,好比這個"@android :style/Theme.Dialog" 就對應於android.R.style.Theme_Dialog ,('_'換成'.' <--注意:這個是文章內容不是笑臉)就能夠用在描述文件 中了,找找類定義和描述文件中的對應關係就都明白了。


三 你後臺的Activity被系統回收怎麼辦:onSaveInstanceState
   
   當你的程序中某一個Activity A 在運行時中,主動或被動地運行另外一個新的Activity B
這個時候A會執行


Java代碼

  • public
    void onSaveInstanceState(Bundle outState) {  

  •     super.onSaveInstanceState(outState);  

  •     outState.putLong("id", 1234567890);  

  • }  


public void onSaveInstanceState(Bundle outState) {    super.onSaveInstanceState(outState);    outState.putLong("id", 1234567890);}


B 完成之後又會來找A, 這個時候就有兩種狀況,一種是A被回收,一種是沒有被回收,被回
收的A就要從新調用onCreate()方法,不一樣於直接啓動的是這回onCreate()裏是帶上參數
savedInstanceState,沒被收回的就仍是onResume就行了。

savedInstanceState是一個Bundle對象,你基本上能夠把他理解爲系統幫你維護的一個Map對象。在onCreate()裏你可能會用到它,若是正常啓動onCreate就不會有它,因此用的時候要判斷一下是否爲空。


Java代碼

  • if(savedInstanceState != null){  

  •      long id = savedInstanceState.getLong("id");  

  • }  


if(savedInstanceState != null){     long id = savedInstanceState.getLong("id");}


就像官方的Notepad教程 裏的狀況,你正在編輯某一個note,忽然被中斷,那麼就把這個note的id記住,再起來的時候就能夠根據這個id去把那個note取出來,程序就完整一些。這也是看你的應用需不須要保存什麼,好比你的界面就是讀取一個列表,那就不須要特殊記住什麼,哦, 沒準你須要記住滾動條的位置...

四 調用與被調用:咱們的通訊使者Intent

要說Intent了,Intent就是這個這個意圖 ,應用程序間Intent進行交流,打個電話啦,來個
電話啦都會發Intent, 這個是Android架構的鬆耦合的精髓部分,大大提升了組件的複用性,好比你要在你的應用程序中點擊按鈕,給某人打電話,很簡單啊,看下代碼先:


Java代碼

  • Intent intent = new Intent();  

  • intent.setAction(Intent.ACTION_CALL);  

  • intent.setData(Uri.parse("tel:" + number));  

  • startActivity(intent);  


Intent intent = new Intent(); intent.setAction(Intent.ACTION_CALL); intent.setData(Uri.parse("tel:" + number)); startActivity(intent);

扔出這樣一個意圖,系統看到了你的意圖就喚醒了電話撥號程序,打出來電話。什麼讀聯繫人,發短信啊,郵件啊,通通只須要扔出intent就行了,這個部分設計 地確實很好啊。

那Intent經過什麼來告訴系統須要誰來接受他呢?
一般使用Intent有兩種方法,第一種是直接說明須要哪個類來接收代碼以下:


Java代碼

  • Intent intent = new Intent(this, MyActivity.class);  

  • intent.getExtras().putString("id", "1");  

  • tartActivity(intent);  


Intent intent = new Intent(this, MyActivity.class);intent.getExtras().putString("id", "1");tartActivity(intent);


第一種方式很明顯,直接指定了MyActivity爲接受者,而且傳了一些數據給MyActivity,在MyActivity裏能夠用getIntent()來的到這個intent和數據。

第二種就須要先看一下AndroidMenifest中的intentfilter的配置了


Xml代碼

  • <intent-filter>

  •     <action
    android:name="android.intent.action.VIEW"
    />

  •     <action
    android:value="android.intent.action.EDIT"
    />

  •     <action
    android:value="android.intent.action.PICK"
    />

  •     <category
    android:name="android.intent.category.DEFAULT"
    />

  •     <data
    android:mimeType="vnd.android.cursor.dir/vnd.google.note"
    />

  • </intent-filter>


<intent-filter>    <action android:name="android.intent.action.VIEW" />    <action android:value="android.intent.action.EDIT" />    <action android:value="android.intent.action.PICK" />    <category android:name="android.intent.category.DEFAULT" />    <data android:mimeType="vnd.android.cursor.dir/vnd.google.note" /></intent-filter> 這裏面配置用到了action, data, category這些東西,那麼聰明的你必定想到intent裏也會有這些東西,而後一匹配不就找到接收者了嗎?

action其實就是一個意圖的字符串名稱。
上面這段intent-filter的配置文件說明了這個Activity能夠接受不一樣的Action,固然相應的程序邏輯也不同咯,提一下那個 mimeType,他是在ContentProvider裏定義的,你要是本身實現一個ContentProvider就知道了,必須指定 mimeType才能讓數據被別人使用。

不知道原理說明白沒,總結一句,就是你調用別的界面不是直接new那個界面,而是經過扔出一個intent,讓系統幫你去調用那個界面,這樣就多麼鬆藕合啊,並且符合了生命週期被系統管理的原則。

想知道category都有啥,Android爲你預先定製好的action都有啥等等,請親自訪問官方連接Intent ps:想知道怎麼調用系統應用程序的同窗,能夠仔細看一下你的logcat,每次運行一個程序的時候是否是有一些信息好比:Starting activity: Intent { action=android.intent.action.MAINcategories={android.intent.category.LAUNCHER} flags=0x10200000comp={com.android.camera/com.android.camera.GalleryPicker} }再對照一下Intent的一些set方法,就知道怎麼調用咯,但願你喜歡:)

相關文章
相關標籤/搜索