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()。因此,這兩個方法的代碼應當是相當輕量級的。
下面這個圖解釋了這三個迴圈和狀態之間狀態的可能路徑。著色的橢圓表示活動的主要狀態,矩形表示當活動在狀態之間轉換時你可以執行的回調方法。
圖1、活動生命週期(來源:Android SDK)
下面的表格對每個方法更詳細的描述和在活動的整個生命週期中的定位。
注意上面表格的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 );
String text = "hello";
Intent intent1 = new Intent(ActivityMain.this, Activity2.class);
intent1.putExtra("activity1", text);
startActivity(intent1 );
B.傳對象,對象要執行個體化,繼承Serializable
Java代碼
Bundle mbundle=new Bundle(); mbundle.putSerializable("user",userList.get(position));
Intent in =new Intent (getApplicationContext(), activity2.class);
in.putExtras(mbundle);
startActivity(in);
Bundle mbundle=new Bundle(); mbundle.putSerializable("user",userList.get(position));
Intent in =new Intent (getApplicationContext(), activity2.class);
in.putExtras(mbundle);
startActivity(in);
activity2中接收:
A:接收
Java代碼
Bundle extras = getIntent().getExtras();
if (extras != null) {
textview.setText(extras.getString("activity1"));
}
Bundle extras = getIntent().getExtras();
if (extras != null) {
textview.setText(extras.getString("activity1"));
}
B.接收
Java代碼
Bundle bundel = getIntent().getExtras();
user= (User) bundel.get("user");
Bundle bundel = getIntent().getExtras();
user= (User) bundel.get("user");
2.SharedPreferences
我在activity1中設定的如下:
Java代碼
SharedPreferences sp =getSharedPreferences("textinfo",0);
Editor editor=sp.edit();
String text = "hello";
editor.putString("text", text);
editor.commit(); Intent i = new Intent(getApplicationContext(),activity2.class);
startActivity(i);
SharedPreferences sp =getSharedPreferences("textinfo",0);
Editor editor=sp.edit();
String text = "hello";
editor.putString("text", text);
editor.commit();
Intent i = new Intent(getApplicationContext(),activity2.class);
startActivity(i);
跳轉到Message的activity,擷取內容如下
Java代碼
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來通知使用者。