Android中Activity总结
昨天總結了Intent,今天來認真搞一下Activity……
簡單來說,Activity就是一個一個的窗口界面,一個應用程序通常由多個聯系松散的Activity組成,一般指定應用中的一個Activity為主Activity,即首次啟動應用時用戶看到的界面,每個Activity均可啟動另一個Activity,而前一個Activity會停止,系統會在返回棧中保留該Activity,當用戶完成當前Activity并返回時,系統會從堆棧中將其彈出并銷毀,恢復前一個Activity。
Activity生命周期:
單個Activity:
onCreate()->onStart()->onResume()->onPause()->onStop()->onDestroy()
前三個是顯示狀態,中間兩個是隱藏狀態,最后一個是銷毀狀態
多個Activity:
MainActivity onCreate()->MainActivity onStart()->MainActivity onResume()->MainActivity onPause()->
SecondActivity onCreate()->SecondActivity onStart()->SecondActivity onResume()->MainActivity onStop()->
SecondActivity onPause()->MainActivity onRestart()->MainActivity onStart()->MainActivity onResume()->SecondActivity onStop()->SecondActivity onDestroy()
橫豎屏切換:
MainActivity onCreate()->MainActivity onStart()->MainActivity onResume()->MainActivity onPause()->MainActivity onSaveInstanceState()->MainActivity onStop()->MainActivity onDestroy()->MainActivity onCreate()->MainActivity onStart()->MainActivity onResume()
注:在使用onDestroy()時,應使用release()釋放資源
實現生命周期的回調:
可以在Activity狀態發生變化時重寫方法,以下框架Activity包括每一個基本生命周期方法
public class ExampleActivity extends Activity {@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);// 活動被創建}@Overrideprotected void onStart() {super.onStart();// 活動將要成為可見的}@Overrideprotected void onResume() {super.onResume();// 活動可見}@Overrideprotected void onPause() {super.onPause();// 另一個活動獲得焦點,當前活動失去焦點}@Overrideprotected void onStop() {super.onStop();// 活動不再是可見的}@Overrideprotected void onDestroy() {super.onDestroy();// 活動將被銷毀} }
啟動Activity方式:
顯示啟動:
Intent intent = new Intent(MainActivity.this, SecondActivity.class); startActivity(intent);或者: Intent intent = new Intent(); ComponentName con = new ComponentName(MainActivity.this, SecondActivity.class); intent.setComponent(con); startActivity(intent);隱式啟動:
在Manifest文件中添加Intent過濾器:
<activity android:name=".SecondActivity"><intent-filter><action android:name = "startSecond"/><category android:name="android.intent.category.DEFAULT/></intent-filter> </activity>之后即可在java文件中隱式啟動Activity: Intent intent = new Intent(); intent.setAction("startSecond"); startActivity(intent);隱式還用于啟動系統應用
啟動系統瀏覽器:
intent.setAction(Intent.ACTION_VIEW); Uri uri = Uri.parse("www.doveminr.com"); intent.setData(uri); startActivity(intent); 啟動相冊: Intent intent = new Intent(); intent.setAction(Intent.ACTION_GET_CONTENT); intent.setType("image/*"); startActivity(intent); 發送短信: Intent intent = new Intent(); intent.setAction(Intent.ACITON_SEND); intent.setType("text/plain"); intent.putExtra(Intent.EXTRA_TEXT, "This is a text"); startActivity(intent);啟動電話: Intent intent = new Intent(); intent.setAction(Intent.ACTION_VIEW); Uri uri = Uri.parse(tel:1234567); intent.setData(uri); startActivity(intent);
1. intent.putExtra("name", "David");
2. Bundle bundle = new Bundle();
? ? bundle.putString("name", "David");
? ? intent.putExtras(bundle);
3. ? bundle.putSerializable("person", person); ? ?//person為一個自己定義的類,傳遞多個數據
? ? ? intent.putExtras(bundle);
4.Bitmap bitmap = BitmapFactory.decodeResource(getResource(), R.drawable.ic_launcher);
? ?bundle.putParcelable("bitmap", bitmap);
? ?intent.putExtras(bundle);
注意:Bundle或Bitmap傳遞數據有大小限制,一般應小于512kb,
啟動Activity以獲得結果:
通過調用startActivityForResult()啟動Activity,在隨后收到后續Activity的結果,則實現onActivityResult()回調方法,當后續Activity完成時,會使用Intent向onActivityResult()方法返回結果。例如,您可呢希望用戶選取其中一位聯系人,以便您的Activity對該聯系人中的信息執行某項操作,可以通過一下代碼創建此類Intent并處理結果:
private void pickContact() {// 創建一個intent去挑選一個聯系人,作為內容提供者的UriIntent intent = new Intent(Intent.ACTION_PICK, Contacts.CONTENT_URI);startActivityForResult(intent, PICK_CONTACT_REQUEST); }@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) {// 如果請求被允許,并且請求是PICK_CONTACT_REQUESTif (resultCode == Activity.RESULT_OK && requestCode == PICK_CONTACT_REQUEST) {// 提交一個請求到聯系人的內容提供者作為聯系人的姓名 Cursor cursor = getContentResolver().query(data.getData(),new String[] {Contacts.DISPLAY_NAME}, null, null, null);if (cursor.moveToFirst()) { // 如果光標非空int columnIndex = cursor.getColumnIndex(Contacts.DISPLAY_NAME);String name = cursor.getString(columnIndex);// 與選中聯系人有關的操作}} }ContentResolver對一個內容提供程序執行查詢,后者返回一個Cursor,讓查詢的數據能夠被讀取。保存Activity狀態:
當Activity暫停或停止時,Activity狀態會得到保留,當Activity暫停或停止時,Activity對象仍保留在內存中,有關其成員和當前狀態的所有信息仍處于活動狀態,因此,用戶在Activity內所做的任何更改都會得到保留,當Activity返回前臺時,這些更改仍然存在。然而,當系統為了恢復內存而銷毀某項Activity時,Activity對象也會被銷毀,故系統在繼續Activity時無法保持狀態,而是必須用戶返回Activityi時重建Activity對象,這種情況下,可以實現另一個回調方法對有關Activity狀態的信息進行保存,以確保有關Activity狀態的重要信息得以保留:onSaveInstanceState()。系統會先調用onSaveInstanceState(),然后再使Activity變得易于銷毀,系統會向該方法傳一個bundle,可以使用putString()和putInt()等方法以名稱-值對形式保存有關Activity狀態的信息。然后,如果系統終止應用進程,且用戶返回Activity,系統會重建Activity并將Bundle同時傳遞給onCreate()和onRestoreInstanceState()。可以使用上述方法從bundle提取保存的狀態并恢復該Activity狀態。若沒有狀態信息需要恢復,則傳遞給Bundle的是空值。
不過,即使您什么都不做,也不實現onSaveInstanceState(),Activity類的onSaveInstanceState()默認實現也會恢復部分 Activity 狀態。具體地講,默認實現會為布局中的每個 View調用相應的onSaveInstanceState()方法,讓每個視圖都能提供有關自身的應保存信息。Android 框架中幾乎每個小部件都會根據需要實現此方法,以便在重建 Activity 時自動保存和恢復對 UI 所做的任何可見更改。例如,EditText小部件保存用戶輸入的任何文本,CheckBox()小部件保存復選框的選中或未選中狀態。您只需為想要保存其狀態的每個小部件提供一個唯一的 ID(通過 android:id屬性)。如果小部件沒有 ID,則系統無法保存其狀態。
盡管 onSaveInstanceState()的默認實現會保存有關您的Activity UI 的有用信息,您可能仍需替換它以保存更多信息。例如,您可能需要保存在 Activity 生命周期內發生了變化的成員值(它們可能與 UI 中恢復的值有關聯,但默認情況下系統不會恢復儲存這些 UI 值的成員)。由于onSaveInstanceState()的默認實現有助于保存 UI 的狀態,因此如果您為了保存更多狀態信息而替換該方法,應始終先調用onSaveInstanceState())的超類實現,然后再執行任何操作。 同樣,如果您替換 onRestoreInstanceState()方法,也應調用它的超類實現,以便默認實現能夠恢復視圖狀態。
處理配置變更
有些設備配置可能會在運行時發生變化(例如屏幕方向、鍵盤可用性及語言)。 發生此類變化時,Android 會重建運行中的 Activity(系統調用onDestroy(),然后立即調用onCreate())。此行為旨在通過利用您提供的備用資源(例如適用于不同屏幕方向和屏幕尺寸的不同布局)自動重新加載您的應用來幫助它適應新配置。處理此類重啟的最佳方法是利用onSaveInstanceState()和onRestoreInstanceState()(或onCreate())保存并恢復 Activity 的狀態
總結
以上是生活随笔為你收集整理的Android中Activity总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android中Intent和Inten
- 下一篇: Activity中加载器的总结