Android筆記-活動生命週期&Bundle回收臨時資料&活動啟動模式&常用技巧

來源:互聯網
上載者:User

標籤:模式   建立   使用者   操作   可見   top   執行   載入   null   

Android使用任務(Task)管理活動,是一組存放在返回棧(Back Stack)裡的活動的合集;

系統總是顯示棧頂活動給使用者;

啟動新活動->新活動入棧

按下Back鍵或調用finish()->棧頂活動出棧

 

活動生命週期的四種狀態:

1. 運行狀態:處於棧頂

2. 暫停狀態:不處於棧頂,但仍然可見

3. 停止狀態:不處於棧頂,完全不可見,系統仍然儲存其狀態和成員變數,但不可靠

4. 銷毀狀態:從棧中移除,活動被系統回收

 

Activity的七個回調方法:

1. onCreate():活動第一次被建立時調用,通常完成初始化操作

2. onStart():活動由不可見變為可見時調用,通常載入資源

3. onResume():活動準備與使用者互動時調用,此時處於棧頂,運行狀態

4. onPause():系統啟動或恢複另一個活動時調用

5. onStop():活動完全不可見時調用,通常完成釋放記憶體和資源操作

6. onDestroy():銷毀前調用,之後變為銷毀狀態

7. onRestart():重新啟動時調用,由停止狀態變為運行狀態

onPause()和onStop()的主要區別:啟動新活動為對話方塊式活動時,執行onPause(),不執行onStop();

 

活動的三種生存期:

1. 完整生存期:onCreate()和onStop()之間的時期

2. 可見生存期:onStart()和onStop()之間的時期

3. 前台生存期:onResume()和onPause()之間的時期

例:

MainActivity第一次被建立時執行onCreate(), onStart(), onResume();

 

點擊button1啟動NormalActiviy,MainActivity執行onPause(), onStop()

 

點擊button2啟動DialogActivity,MainActivity只執行onPause()

 

因為DialogActivity沒有完全遮擋MainActivity,MainActivity只是進入暫停狀態而不是停止狀態

 

點擊Back鍵返回MainActivity,只執行onResume()

 

在MainActivity點擊Back鍵退出程式,執行onPause(),onStop(),onDestroy()

 

 

通過Bundle在活動回收時儲存臨時資料

活動進入停止狀態後,當記憶體不足時可能被系統回收。因為方法onSaveInstanceState()在活動被回收前一定會被調用,可通過重寫該方法不保證臨時資料的儲存:

@Overrideprotected void onSaveInstanceState(Bundle outState) {    super.onSaveInstanceState(outState);    String tempData = "Something you just typed";    outState.putString("data_key", tempData);}

 

修改onCreate方法,在setConetentView()語句後添加:

if (savedInstanceState != null) {    String tempData = savedInstanceState.getString("data_key");    Log.d(TAG, tempData);}

 

如果活動被系統回收前有通過onSaveInstanceState()儲存資料,onCreate()接受的Bundle參數就會帶有所儲存的資料,可通過相應取值方法取出資料

運行程式,旋轉螢幕使系統自動銷毀活動,onSaveInstance()被調用,螢幕切換後系統自動建立活動調用onCreate()

 

 

活動的啟動模式有四種:standard、singleTop、singleTask和singleInstance;

啟動模式可在AndroidManifest.xml的<activity>中的android:launchMode屬性指定;

 standard:預設啟動模式,系統不考慮返回棧中是否已有該活動,每次啟動都會建立一個新的活動執行個體;

singleTop:如果棧頂已經是該活動,則直接使用,不會建立新的活動執行個體。如果未處於棧頂,建立新的活動執行個體;

singleTask:如果棧中已存在該活動執行個體則直接使用,並把該活動之上的所有活動出棧。如果沒有則建立新的活動執行個體;

singleInstance:會啟動一個單獨的新返回棧管理該活動,訪問該活動的應用程式共用一個(原)返回棧,從而共用活動執行個體;

 

 

技巧:快速判斷當前在哪個活動

建立類BaseActivity,重寫其onCreate()方法:

protected void onCreate(Bundle saveInstanceState) {    super.onCreate(saveInstanceState);    Log.d("ThirdActivity", "Task id is "+getTaskId());    requestWindowFeature(Window.FEATURE_NO_TITLE);    setContentView(R.layout.third_layout);}

使所有活動繼承自父類BaseActivity,則每次調用onCreate()建立活動時能夠列印執行個體類名,判斷當前處於哪個活動。

 

技巧:快速退出程式

建立類ActivityCollector作為Active Manager:

public class ActivityCollector {    public static List<Activity> activities = new ArrayList<Activity>();    public static void addActivity(Activity activity) {        activities.add(activity);    }    public static void removeActivity(Activity activity) {        activities.remove(activity);    }    public static void finishAll() {        for (Activity activity : activities) {            if(!activity.isFinishing()) {                activity.finish();            }        }    }}

修改BaseActivity中代碼,在onCreate()中添加:

ActivityCollector.addActivity(this);

在onDestroy()中添加:

ActivityCollector.removeActivity(this);

在需要一鍵退出程式的按鈕監聽事件中添加:

ActivityCollector.finishAll();

 

技巧:傳遞資料啟動活動的寫法

在需要接收Intent傳遞的資料的活動SecondActivity中添加方法actionStart():

public static void actionStart(Context context, String data1, String data2) {    Intent intent = new Intent(context, SecondActivity.class);    intent.putExtra("param1", data1);    intent.putExtra("param2", data2);    context.startActivity(intent);}

在其中完成intent的構件,這樣所有SecondActivity所需的資料都在方法參數中體現;

在需要啟動SecondActivity的按鈕監聽事件中直接調用:

 

SecondActivity.actionStart(FirstActivity.this,"data1","data2");

 

參考資料:《第一行代碼》

Android筆記-活動生命週期&Bundle回收臨時資料&活動啟動模式&常用技巧

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.