Android 第三课 Activity的生命周期
?新建項(xiàng)目ActivityLifeCycleTest,創(chuàng)建主活動(dòng)后,再新建兩個(gè)子活動(dòng)--NormalActivity和DialogActivity。
現(xiàn)在活動(dòng)及其對(duì)應(yīng)布局文件創(chuàng)建完畢。
編輯normal_layout.xml文件,代碼如下:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical" android:layout_width="match_parent"android:layout_height="match_parent"> <TextViewandroid:layout_width="match_parent"android:layout_height="wrap_content" android:text="This is a normal activity"/> </LinearLayout>只是簡(jiǎn)單是使用了一個(gè)TextView,用來(lái)顯示一行文字。
然后編輯dialog_layout.xml,代碼如下:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical" android:layout_width="match_parent"android:layout_height="match_parent"><TextViewandroid:layout_width="match_parent"android:layout_height="wrap_content" android:text="This is a dialog activity"/> </LinearLayout>從名字上可以看出來(lái)這兩個(gè)子活動(dòng)一個(gè)是普通的活動(dòng),一個(gè)是對(duì)話框式的活動(dòng)。現(xiàn)在我們來(lái)修改這個(gè)對(duì)話框式的活動(dòng),打開(kāi)AndroidManifest.xml文件的<activity>標(biāo)簽,并修改。代碼如下:
<activity android:name=".DialogActivity"android:theme="@style/Theme.AppCompat.Dialog"> </activity>這里是活動(dòng)的注冊(cè)碼,并且只給DialogActivity的代碼進(jìn)行了修改,給它使用了android:theme屬性,這是用來(lái)給當(dāng)前活動(dòng)指定主題的,Android系統(tǒng)內(nèi)置了很多主題可以選擇,這里是讓DialogActivity使用對(duì)話框式的主題。
接下來(lái),重新定制主活動(dòng)的布局,將里面的代碼替換成如下:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent"><Buttonandroid:id="@+id/start_normal_activity"android:layout_width="match_parent"android:layout_height="wrap_content" android:text = "Start NormalActivity"/><Buttonandroid:id="@+id/start_dialog_activity"android:layout_width="match_parent"android:layout_height="wrap_content" android:text= "Start DialogActivity"/> </LinearLayout>只是添加了兩個(gè)按鈕,分別對(duì)應(yīng)兩個(gè)子活動(dòng)。
最后修改MainActivity中的代碼,如下所示:
package com.example.activitylifecycletest; import android.content.Intent; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.Button; public class MainActivity extends AppCompatActivity { public static final String TAG = "MainActivity";?//定義當(dāng)前類名為常量@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Button StartNormalActivity = (Button) findViewById(R.id.start_normal_activity);Button StartDialogActivity = (Button) findViewById(R.id.start_dialog_activity);StartNormalActivity.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {Intent intent = new Intent(MainActivity.this,NormalActivity.class);startActivity(intent);}});StartDialogActivity.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {Intent intent = new Intent(MainActivity.this,DialogActivity.class);startActivity(intent); }})} @Overrideprotected void onStart() {super.onStart();Log.d(TAG,"onStart");}@Overrideprotected void onResume() {super.onResume();Log.d(TAG,"onResume");}@Overrideprotected void onPause() {super.onPause();Log.d(TAG,"onPause");}@Overrideprotected void onStop() {super.onStop();Log.d(TAG,"onStop");}@Overrideprotected void onDestroy() {super.onDestroy();Log.d(TAG,"onDestroy");} }在onCreate()方法中,我們分別為兩個(gè)按鈕定義了點(diǎn)擊事件,點(diǎn)擊按鈕會(huì)啟動(dòng)相應(yīng)的Activity,然后會(huì)在Activity的7個(gè)回調(diào)方法中分別打印了一句話,這樣更好的觀察理解活動(dòng)的生命周期。
- 倘若活動(dòng)被回收了怎么辦?
假設(shè)有一個(gè)活動(dòng)A,在活動(dòng)A的基礎(chǔ)上啟動(dòng)了活動(dòng)B,那么活動(dòng)A進(jìn)入了Stop狀態(tài),這時(shí)突然由于系統(tǒng)內(nèi)存不存,將活動(dòng)A回收了,然后用戶按下Back鍵返回活動(dòng)A,會(huì)出現(xiàn)什么情況呢?還是會(huì)正常啟動(dòng)A的,只不過(guò)并不是執(zhí)行onReStart()方法,而是會(huì)執(zhí)行活動(dòng)A的onCreate()方法,因?yàn)榛顒?dòng)A在這種情況會(huì)被重新創(chuàng)建一次。那么加入活動(dòng)A本來(lái)是存在臨時(shí)數(shù)據(jù)和狀態(tài)的,那么重新創(chuàng)建一次,什么都不沒(méi)有顯示了,這不是令人很難過(guò)嗎?
經(jīng)查閱文檔。Activity中還提供了一個(gè)onSaveInstanceState()回調(diào)方法,這個(gè)方法可以保證活動(dòng)在回收之前一定被調(diào)用,因此這個(gè)方法來(lái)解決活動(dòng)被回收時(shí),臨時(shí)數(shù)據(jù)得不到保存的問(wèn)題。
onSaveInstanceState()方法會(huì)攜帶一個(gè)Bundle類型的參數(shù),Bundle提供了一系列的方法用于保存數(shù)據(jù),例如可以使用putString()來(lái)保存字符串,使用putInt()保存整型,每個(gè)保存方法有兩個(gè)參數(shù),一個(gè)是鍵,用于后面從Bundle中取值,第二個(gè)參數(shù)是真正要保存的內(nèi)容。這么看來(lái),鍵和保存的內(nèi)容是一一對(duì)應(yīng)的吧。
在MainActivity中添加如下代碼:
@Overrideprotected void onSaveInstanceState(Bundle outState) {super.onSaveInstanceState(outState);String tempData = "Something you just typed";outState.putString("data_key",tempData);}我們是在MainActivity文件中重寫了這個(gè)方法。那么數(shù)據(jù)是保存好了,但是我們應(yīng)該在哪里恢復(fù)呢?我們之前一直使用的onCreate()方法其實(shí)也有一個(gè)Bundle類型的參數(shù)。這個(gè)參數(shù)一般情況是null,但是如果在活動(dòng)被回收之前有通過(guò)onSaveInstanceState()方法來(lái)保存數(shù)據(jù)的話,這個(gè)參數(shù)就會(huì)帶有之前所保存的全部數(shù)據(jù),我們只需要修改MainActivity的onCreate()方法,代碼如下: protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);Log.d(TAG,"onCreate");setContentView(R.layout.activity_main);if(savedInstanceState !=null){String tempData = savedInstanceState.getString("data_key");Log.d(TAG,tempData);}Button StartNormalActivity = (Button) findViewById(R.id.start_normal_activity);Button StartDialogActivity = (Button) findViewById(R.id.start_dialog_activity);StartNormalActivity.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {Intent intent = new Intent(MainActivity.this,NormalActivity.class);startActivity(intent);}});StartDialogActivity.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {Intent intent = new Intent(MainActivity.this,DialogActivity.class);startActivity(intent);}});} Intent還可以結(jié)合Bundle一起用于傳輸數(shù)據(jù),首先可以把需要傳遞的數(shù)據(jù)都保存在Bundle對(duì)象中,然后再將Buddle對(duì)象存放在Intent里。到了目標(biāo)活動(dòng)之后先從Intent中取出Bundle,在從Bundle中一一取出數(shù)據(jù)。總結(jié)
以上是生活随笔為你收集整理的Android 第三课 Activity的生命周期的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: velocity语法
- 下一篇: Android 第四课 活动的启动模式