天天看點

大話企業級android讀書筆記(二)

android的四大元件

android的管理者:activity

使用者想在螢幕上做什麼,怎麼處理使用者做出不同的操作都由該activity來管理和排程。

所有有使用者操作類都必須繼承自activity

比如想處理按鍵按下事件

@override

public boolean onkeydown(int keycode,keyevent event){

  //處理按鍵按下事件

}

如果一個活動被暫停或停止,系統可以将它從記憶體移除,通過要求它結束(通過調用它的finish()方法),或簡單地殺掉它的程序。當它再次顯示給使用者時,必須要完全重新啟動和恢複到之前的狀态。随着活動從一個狀态轉為另一個狀态,通過調用下面的受保護的方法通知該改變:

void oncreate(bundle saveinstancestate)

void onstart()

void onrestart()

void onresume()

void onpause()

void onstop()

void ondestroy()

所有這些方法都是鈎子,你可以重寫當狀态改變時做适當的工作。所有的活動必須要實作oncreate()去做一些初始化的設定,當對象第一次執行個體化的時候。很多活動也會實作onpause()去送出資料修改或準備停止與使用者互動。

将他們合并在一起,這七個方法定義了活動的整個生命周期。有三個嵌套的循環,你可以通過這七個方法監視:

活動的整個生命時間,從第一次調用oncreate()開始直到調用ondestroy()結束。一個活動在oncreate()中做所有的“全局”狀态的初始設定,在ondestroy()中釋放所有保留的資源。舉例來說,有一個線程運作在背景從網絡上下載下傳資料,它可能會在oncreate()中建立線程,在ondestroy()中結束線程。

活動的可視生命時間,從調用onstart()到相應的調用onstop() 。在這期間,使用者可以在螢幕上看見活動,雖然它可能不是運作在前台且與使用者互動。在這兩個方法之間,你可以保持顯示活動所需要的資源。舉例來說,你可以在onstart()中注冊一個廣播接收者監視影響你的ui的改變,在onstop() 中登出。因為活動在可視和隐藏之間來回切換,onstart()和onstop() 可以調用多次。

活動的前台生命時間,從調用onresume()到相應的調用onpause()。在這期間,頻繁地在重用和暫停狀态轉換——例如,當裝置進入睡眠狀态或一個新的活動啟動時調用onpause(),當一個活動傳回或一個新的意圖被傳輸時調用onresume()。是以,這兩個方法的代碼應當是相當輕量級的。

下面這個圖解釋了這三個循環和狀态之間狀态的可能路徑。着色的橢圓表示活動的主要狀态,矩形表示當活動在狀态之間轉換時你可以執行的回調方法。

大話企業級android讀書筆記(二)

圖1、活動生命周期(來源:android sdk)

下面的表格對每個方法更詳細的描述和在活動的整個生命周期中的定位。

大話企業級android讀書筆記(二)
大話企業級android讀書筆記(二)

注意上面表格的killable列,它表示當方法傳回時沒有執行活動的其它代碼,系統是否能殺死活動寄宿的程序。三個方法(onpause()、onstop()、ondestroy())标記為yes。因為onpause()是唯一一個保證在程序被殺之前會調用的,是以你應該使用onpause()來寫任何持久化存儲資料。

被标記為no的方法保護活動寄宿的程序在他們調用的時候不會被殺掉。是以活動是可殺掉狀态,例如onpause()傳回到onresume()調用期間。直到onpause()再次傳回,活動是不可殺掉的。其實,沒有标記為killable的活動也是可以系統被殺掉的,不過這僅僅發生在極端困難的情況下,沒有有任何其他資源可用。

1.通過intent來傳遞:

  a.傳字元等:activity1中設定:

  java代碼

  string text = "hello";

  intent intent1 = new intent(activitymain.this, activity2.class);

  intent1.putextra("activity1", text);

  startactivity(intent1 );

  b.傳對象,對象要執行個體化,繼承serializable

  bundle mbundle=new bundle(); mbundle.putserializable("user",userlist.get(position));

  intent in =new intent (getapplicationcontext(), activity2.class);

  in.putextras(mbundle);

  startactivity(in);

  activity2中接收:

  a:接收

  bundle extras = getintent().getextras();

  if (extras != null) {

  textview.settext(extras.getstring("activity1"));

  }

  b.接收

  bundle bundel = getintent().getextras();

  user= (user) bundel.get("user");

  2.sharedpreferences

  我在activity1中設定的如下:

  sharedpreferences sp =getsharedpreferences("textinfo",0);

  editor editor=sp.edit();

  editor.putstring("text", text);

  editor.commit(); intent i = new intent(getapplicationcontext(),activity2.class);

  startactivity(i);

  editor.commit();

  intent i = new intent(getapplicationcontext(),activity2.class);

  跳轉到message的activity,擷取内容如下

  sharedpreferences share=getsharedpreferences("textinfo",0);

  string text =share.getstring("text", null);

  msgtextview.settext(text);

android的郵差:intent

android基本設計理念是鼓勵減少元件間的耦合,是以android提供了intent(意圖),intent提供了一種通用的消息系統,它允許在你的應用程式與其它的應用程式間傳遞intent來執行動作和産生事件。

用于多個activity之間互相傳遞資料。

android的隐形管理者:service

service從字面上了解即為“服務”,這裡與windows中的服務有點類似。

service是在背景運作的,沒有互動的界面

使用service的好處是可以同時運作多個任務,而activity隻能運作一個可互動的界面。

startservice()和bindservice()的差別:startservice(),service是通過接收intent經曆oncreate()和onstart(),當使用者在發出意圖使之銷毀時會經曆ondestory(),而bindservice()方式啟動,在與activity綁定的時候,會經曆oncreate()和onbind()而當activity被銷毀的時候,service會先調用onunbind(),然後是ondestory().

android的接收員:broadcastreceiver

廣播接收者用于異步接收廣播intent

廣播接收者沒有界面,但是接收到消息後可以啟動一個activity,或者可以使用notifcationmanager來通知使用者。

繼續閱讀