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